omnetpp: избегайте ошибки «отправка во время передачи» с помощью sendDelayed () - PullRequest
0 голосов
/ 02 июня 2018

Я внедряю PON в OMNet ++ и пытаюсь избежать ошибки времени выполнения, возникающей при передаче во время другой передачи.Единственный способ избежать этого - использовать sendDelayed() (или scheduleAt() + send(), но я не предпочитаю этот способ).

Даже если я использовал sendDelayed(), я все еще получаю этоошибка выполнения.Мой вопрос: когда именно ядро ​​проверяет, свободен ли канал, если я использую sendDelayed(msg, startTime, out)?Он проверяет на simTime() + startTime или на simTime()?

Я прочитал Руководство по симуляции, но про этот случай я не совсем понял.

1 Ответ

0 голосов
/ 11 июня 2018

Бизнес канала проверяется только , когда вы планируете сообщение (т.е. в simTime (), как вы просили).На этом этапе проверяется, запланировано ли сообщение доставить в время после channel->getTransmissionFinishTime(), т. Е. Вы можете запросить, когда закончится текущая передача, и вы должны запланировать сообщениена то время или позже).Но учтите, что эта проверка предназначена только для выявления наиболее распространенных ошибок.Если вы запланируете, например, ДВА сообщения на одно и то же время с помощью sendDelayed (), ядро ​​проверит только то, что запускается после того, как текущий идентификатор переданного сообщения завершен, но НЕ обнаружит, что вы запланировали два или более сообщений дляв то же время после этого момента времени.

Как правило, когда вы передаете по каналу, в котором для передачи данных установлено ненулевое время (т. е. для передачи сообщения требуется время), вы всегда должны соблюдать осторожность.что происходит, когда сообщения приходят быстрее, чем скорость канала.В этом случае вы должны либо выбросить сообщение, либо поставить его в очередь.Если вы ставите его в очередь, то вам, очевидно, придется поместить его в структуру данных (очередь), а затем запланировать выполнение таймера автоспуска в тот момент, когда канал сообщений освобождается (и сообщение доставляется на другой стороне).На этом этапе вы должны получить следующий пакет из очереди, поместить его в канал и запланировать следующий таймер автоспуска на время доставки этого сообщения.

По этой причине использование только sendDelayed()НЕ правильное решение, потому что вы просто пытаетесь неявно реализовать очередь, откладывая сообщение.В этом случае проблема заключается в том, что, как только вы запланируете сообщение с помощью sendDelay (), какую задержку вы будете использовать, если поступит другой пакет, а затем другой будет коротким периодом времени?Как видите, вы неявно создаете здесь очередь, откладывая событие.Вы просто используете основную очередь событий симуляции для хранения пакетов, но она намного более запутана и подвержена ошибкам.

Короче говоря, создайте очередь и запланируйте собственное событие для правильного управления содержимым очереди или отбрасывания пакетов.если это соответствует вашим потребностям.

...