4.1简单模块
4.1.1omnet++中离散事件
一个离散事件系统是指一个系统的状态改变是离散的,在两个连续的事件之间没有如何事件发生。简单地说,事件规定了系统状态的改变,状态的修改仅在事件发生时进行。离散事件系统可以使用离散事件模拟进行仿真。例如,计算机网络通常被看作是离散事件系统。
部分事件包括:
- 包传输的开始
- 包传输的结束
- 等待重传时间到达
事件发送的时间通常被称作事件时间戳,在omnet中叫做到达时间。模拟时间或虚拟时间是指模拟程序运行了多长时间,相对的真实时间或cpu时间是指多少cpu时间被消耗。
omnet++使用消息来描述事件。每一事件都通过一个cMessage类或它的一个子类来表示:不存在单独的事件类。消息从一个模块发送到另一个模块——这意味着”事件将发生“的地方就是消息的目的模块,事件发生的模拟时间就是消息到达时间。像”等待满期“事件通过模块给自己发送一个消息而实现。
omnet++中的模拟时间被存储在c++类型的simitime_t中,是双精度类型。
4.1.2包传输模型
(1)延迟、比特误差率、数据速率
可以被三个指针赋值的连接便利了通信网络建模,对其他模型来说也非常有用。
所有的这些指针都是可选的,可以为每一个连接指定链接指针,也可以定义链接类型,并在整个模块中使用。传播延迟是消息通过通道到达目的地的时间段,传播延迟以秒为单位计算。比特误差率对消息的传输有影响,比特误差率就是一个比特被错误传输的几率。
一条有N比特的消息,没有错误的比特长度:
消息有一个错误标志。
数据速率的单位bits/second
消息的发送时间与传输的第一个比特和接收的最后一个比特相关。
上面的模型不能模拟所有的协议,在token ring和FDDI协议中,站发送重复的比特直到整个帧到达。如果一条消息沿途经过一系列的链接与模块。模块的行为好像每一个模块都在等待消息的最后一个比特到达,然后开始发送。因为上述的影响是不期望的,更希望数据通过只有一个链接的路由来传播。
4.1.3定义简单模块
(1)直接或间接定义一个CSimpleModule的子类;
(2)以define_Module()或define_Like()宏注册之;
(a)作用:声明一个simple module类型并且建立与相应的ned文件的关联。前者用于类名与ned定义的SimpleModule名相同,后者用于不同,可以为一个ned描述的SimpeModule提供不同的实现。
(a)每个impleModule都必须手动添加该宏,CompondModule由omnet自动添加。
(3)实现模块类
(4)建立构造函数
4.1.3简单模块中的主要成员函数
(1)activity
它使得你可以像编写一个进程、线程一样编写一个简单模块。等待消息、延缓执行时间等等。拥有这个函数的简单模块们作为一系列协同程序协同执行,又称之为协同多任务。手动设置模块栈空间,一般为16k,如果模块存在递归或本地变量占空间较大的话,可以设置为更大的栈空间。
(2)handleMessage
(a)为每个message、event调用handleMessage()
(b)需要在每个intialize()函数中初始化变量,一些基于协同的函数如wait()、receive()等均不能调用。
(c)SimpleModule的stacksize一定要设置为0。
(3)initialize()
在初始化消息放入FES(Future Event Set)后,在执行前被调用,初始化成员变量。复合模块的初始化优先于其子模块。
(4)Finish()
循环结束(FES没有模拟事件时)后正常终止时被调用,模块的调用顺序刚好与initialize()相反。