概述
1、 Tkenv
在INI文件中,Tkenv有以下配置选项:
Tkenv-extra-stack:当仿真在Tkenv下运行时,此选项为每个基于activity()的简单模块指定额外的预留的堆栈空间(单位为kb)。这个值明显高于Cmdenv中类似的值(处理GUI事件需要大量的堆栈空间)
Tkenv-default-config:指定Tkenv默认使用的INI文件。如果此选项为空,Tkenv就配置文件进行询问。
Tkenv-default-run:指定Tkenv默认执行的运行。如果没有此选项,Tkenv进行交互式询问。
Tkenv-image-path:指定Tkenv加载图像的目录(除了OMNETPP_IMAGE_PATH或其内置的默认值)
Tkenv-plugin-path:指定用tcl编写的Tkenv插件将要浏览的目录(除了OMNETPP_PLUGIN_PATH或其内置的默认值)
其余的Tkenv选项保存在用户主目录的.tkenvrc文件中。
2、 信号
信号一般以名称加以识别,但为了提高效率,程序运行过程中一般使用动态分配的数字标示符,即信号ID进行识别(信号ID定义为simsignal_t)。收听者通过信号名称或信号ID订阅信号,而不考虑信号来源。
信号的发射通过重载emit()函数(发送信号组件)和receiveSignal()函数(信号的订阅者)实现。
在cComponent中已声明了与信号相关的类函数,所以在cMoudle和cChannel中可以直接使用这些函数。
信道或模块使用emit函数发射信号。Emit()函数的参数分别是信号id和信号值。格式为:
Emit(lengthSignalId,quequ.length());
信号值的类型可以是long,double,simtime_t,const char或cObject。若信号不包含收听者,函数emit()的运行时间消耗最小。如果生成信号所包含的信号值要花费的运行时间比较长,那么应该调用函数mayHaveListeners()或hasListeners(),提前对信号进行检查以确认该信号是否拥有收听者。如果没有就可以跳过此信号的发射动作,这样可以节省大量的时间。
3、发送和接收消息
3.1自消息
几乎所有的仿真模型都需要实现定时器、超时、延迟等,而实现上述目的的途径便是调度未来事件。下面是一些典型的例子:
(1) 定期产生和发送消息的源模块需要在每一次发送操作完成后调度下一个发送任务
(2) 如果服务器处理的任务来自排列,那么它在每次开始处理任务之前都要启动一个定时器。当定时器到达设定的时刻时,将完成的任务发送出去并开始处理新的任务
(3) 当使用带重发功能的通信协议来发送数据包时,需要调度一个超时事件,如果在规定时间未得知消息成功发送,数据包需要重新传输。
在omnet中,简单模块通过向自身发送一条消息便可以解决上述问题,此消息将在到达时间传送到本模块。以上述方式使用的消息成为自消息。
事件调度: scheduleAt(absoluteTime),
scheduleAt(absoluteTime,msg),scheduleAt()的参数为绝对仿真时间,通常由simTime()+delta计算而得。
自消息和其他消息以同样的方式传递到模块(通过常用的接收函数或handleMessage());模块可调用isSelfMessage()函数来检查接收到的消息是否是自消息。也可调用该消息的类函数isScheduled()来确定此消息是否在当前FES中。
事件取消
对于已经被调度的消息,任然是可以取消的(也就是从FES中移出)。这一特性有助于实现超时事件:cancelEvent(msg)。cancelEvent()函数的参数是所要取消的消息的指针,调用后其返回值是同一指针。对于已被取消的消息,可以将其删除或在后续的scheduleAt()调用中重新使用这些消息。对没有调度的消息调用函数,cancelEvent()不会起任何作用。除此之外,还有用于取消事件的更简便的函数cancelAndDelete(),其内部实现形式是if(msg=!NULL)delete cancel Event(msg),该函数主要用于编写析构函数。
重新调度事件
如果想重新调度已经被调度的事件,首先必须使用cancelEvent()将其取消,然后调用函数scheduleAt()对其重新调度。
4、网络层
位于MAC层之上与APL层交互的一个协议层,任务是通过正确操作数据链路层的功能来向应用层提供合适的服务接口。
最后
以上就是无心发夹为你收集整理的Tkenv、信号、消息发送接收的基础知识的全部内容,希望文章能够帮你解决Tkenv、信号、消息发送接收的基础知识所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复