omn​​etpp:使用sendDelayed()避免“发送时发送”错误

时间:2018-06-01 23:15:11

标签: omnet++

我正在OMNet ++中实现一个PON,我正在努力避免在另一个传输正在进行时传输时发生的运行时错误。避免这种情况的唯一方法是使用sendDelayed()(或scheduleAt() + send(),但我不喜欢这样做。)

即使我使用过sendDelayed(),我仍然会收到此运行时错误。我的问题是:当我正在使用sendDelayed(msg, startTime, out)时,内核是否正确检查通道是否空闲?它会在simTime() + startTimesimTime()进行检查吗?

我阅读了模拟手册,但我不清楚这个案例。

1 个答案:

答案 0 :(得分:0)

当您安排消息时(例如,按照您要求的simTime()),将仅 检查频道的业务。此时,检查消息是否安排在 channel->getTransmissionFinishTime()之后的时间传递,即您可以查询当前正在进行的传输何时完成且您必须安排该时间或之后的消息)。但请注意,此检查仅用于捕获最常见的错误。如果您使用sendDelayed()同时安排两个消息,内核将仅检查在当前传输的消息ID完成后启动,但不会检测到您已安排两个或更多消息在那个时间点之后的同一时间。

通常,当您通过数据速率设置为非零时间的通道进行传输时(即传输消息需要时间),您始终必须注意当消息速度快于速率时发生的情况这个频道。在这种情况下,您应该丢弃消息,或者应该排队。如果你排队,那么你显然必须把它放入一个数据结构(队列),然后安排一个自定时器在消息通道空闲时执行(并在另一侧传递消息)。此时,您应该从队列中获取下一个数据包,将其放在频道上,并在传递此消息时安排下一个自定时器。

出于这个原因,仅使用sendDelayed()并不是正确的解决方案,因为您只是试图隐式实现推迟消息的队列。问题是在这种情况下,一旦你使用sendDelay()安排一条消息,如果另一个数据包到达,你将使用什么延迟,然后另一个是短时间帧?如您所见,您通过推迟事件隐式地在此创建队列。您只是使用模拟的主要事件队列来存储数据包,但更容易发生错误。

简而言之,创建一个队列并安排自我事件以正确管理队列内容,或者根据需要丢弃数据包。