我是omnet++的新手。为了熟悉它,我试图在一个有“n”个节点的环形拓扑中模拟一个简单的循环调度。它编译得很好,但模拟本身并不像预期的那样运行。理想情况下,它应该显示环形拓扑中的“n”个节点,并且应该从node1开始向它们发送和处理消息。这是NED文件的样子:
import ned.DelayChannel;
module Node
{
parameters:
double cpuClock = 500;
double memsize = 512;
int numCores = 1;
gates:
inout out[];
connections allowunconnected:
}
network RingTopology
{
parameters:
int numNodes = 4; // number of nodes in the ring
types:
channel RingChannel extends ned.DelayChannel
{
delay = 1us;
}
submodules:
node[numNodes]: Node {
@display("p=100,100;i=device/cpu_s");
gates: out[2];
}
connections allowunconnected:
for i=0..numNodes-1 {
node[i].out[0] <--> DelayChannel <--> node[(i+1)%numNodes].out[1];
}
}
这就是C++文件的样子:
#include <omnetpp.h>
#include <string.h>
using namespace omnetpp;
class RingTopology : public cSimpleModule
{
public :
RingTopology() : tasks {8, 6, 36, 88, 15, 14, 46, 29, 30, 5, 93, 43, 68, 65, 20, 69, 49} {}
private:
int numNodes;
int cpuClock;
const int numTasks = 17;
// const int numTasks;
int currentTask;
int tasks[];
protected:
virtual void initialize() override;
virtual void handleMessage(cMessage *msg) override;
};
class Node : public cSimpleModule
{
private:
int numNodes;
int numCores;
protected:
virtual void initialize() override;
virtual void handleMessage(cMessage *msg) override;
};
Define_Module(RingTopology);
void RingTopology::initialize()
{
numNodes = par("numNodes");
cpuClock = par("cpuClock");
currentTask = 0;
}
//void Node::handleMessage(cMessage *msg)
void RingTopology:: handleMessage(cMessage *msg)
{
if (msg->isSelfMessage()) {
// Round-robin scheduling
if (currentTask < numTasks-1)
currentTask++;
else
currentTask = 0;
// Calculate time slice based on task time and CPU speed
int SIMTIME_HZ = 1000000000;
simtime_t cpuClock = SimTime(500.0, SIMTIME_US) * SIMTIME_HZ;
double taskTime = tasks[currentTask] * 1.0; // convert taskTime to double
simtime_t timeSlice = taskTime / cpuClock; // divide taskTime by cpu clock to find the number of seconds required to finish the task
msg->setKind(1);
send(msg, "out", currentTask % numNodes);
scheduleAt(simTime() + timeSlice, msg);
}
else {
// Message from another node, process it
handleMessage(msg);
}
}
而.ini文件看起来是这样的
[General]
# nothing here
[RingTopology]
network = RingTopology
运行模拟时,模拟器窗口如下所示:
请让我知道如何解决这个问题,我做错了什么。谢谢
1条答案
按热度按时间hc2pp10m1#
您的模拟不起作用,因为在
initialize()
中,您既不发送self消息,也不发送消息。但是,即使您添加了发送缺少的消息,您的代码也会引发错误。请关注以下行:
消息(更确切地说:指向cMessage对象的指针)在发送后不得使用。请参阅OMNeT++模拟手册-第4.7.3章:
消息就像一个真实世界的对象--它不能同时在两个地方。一旦发送出去,消息就不再属于模块:它被模拟内核接管,并最终被传递到目标模块。发送方模块甚至不应该再引用它的指针。