我在omnet ++中构建自己的复合模块,其中包含多个简单模块,并具有分层架构。但是在模块间通信中仅使用send()
(比如我的App生成器使用send()将数据包发送到缓冲区下方)似乎会增加总网络延迟。
另外,我已经看到其他支持良好的模型,如inet,mixim等,使用sendDirect和send和sendDelayed交替使用。
所以,我的问题是,何时使用send()
,sendDirect()
和sendDelayed()
?
他们有任何延迟差异吗?
答案 0 :(得分:4)
有几种方法可以在模块之间交换信息。您使用哪一个取决于您传递的数据以及与协议本身相关的交换量。
首先澄清:使用ButtonPressed
或send()
NOT 会增加延迟。如果您通过普通频道发送消息或使用sendDirect()
,则消息将在当前模拟时间(即现在)传送到目标模块。当在目的地处理消息时,模拟时间将是相同的,因此模拟时间没有额外的延迟。 sendDirect()
显然会增加延迟,但无论如何这都是它的主要目的。
您必须决定是否要将消息传递用作模块之间的通信方式(这是异步的),或者您希望直接调用其他模块(即同步)。在第一种情况下,您可以使用OMNeT ++的调度功能(即sendDelayed()
,send
,sendDelayed
等)。在第二种情况下,您通常通过获取指向它的指针直接调用另一个模块,并可能使用sendDirect
将其强制转换为适当的类型。像check_and_cast<>
和getParentModule()
这样的方法在这里很有用,可以获得指向所需模块的指针。
当模块之间的通信被视为“实现”细节时,直接调用很有用。它也更快(在CPU使用方面)和同步(因此你可以得到一个返回值)。
如果您使用GUI运行时环境传递要在模拟期间检查的数据(即您希望看到小点飞来飞去),那么您应该使用消息定义和findSubmodule()
/ {{1等等。
最后,send()
和sendDirect()
之间存在差异。如果您有通过通道连接门的拓扑(即您现在提前通信),则通常使用send()
(例如有线网络)。如果您事先不知道通信路径,那么您通常会获得指向目标模块的指针,但之后您将使用sendDirect()
发送异步消息。这通常是无线网络中的情况。