Я пытаюсь смоделировать большое количество случайно сгенерированных сетей 802.15.4. Я запускаю 250 FFD, до 50 RFD и координатора PAN. Диапазон передачи составляет 40 м, размер топологии 500 х 500 м, и моделирование заканчивается через 1800 с (30 минут). Каждый RFD создает одну связь CBR с координатором PAN, начиная с 0 с и отправляя все через симуляцию с интервалами 2 с. Размер пакета составляет 70 [байтов].
Теперь о важной части — поскольку это «большая» симуляция, я использую планировщик «Планировщик / Куча». Я говорю, что это важно, потому что я начал получать ошибки формы (в ретроспективе, вероятно, это не важно, но это была подсказка мэра, что что-то не так!):
msgstr «ns: планировщик движется назад во времени от ‘x’ к ‘y'»
Поэтому обычно я искал файлы scheduler.cc, scheduler.h и heap.h в поисках ответа. После полных 12 часов отладки (я не опытный пользователь Linux и не хороший программист на С ++) я наконец нашел причину / симптом — пакет, уже содержащийся в куче, изменит (увеличит) его значение времени. Это, конечно, полностью испортит структуру кучи, и в конечном итоге этот пакет будет извлечен и обработан, но следующий пакет потерпит неудачу, потому что он будет иметь меньшее значение времени.
Теперь, это поведение — явный признак изменения по ссылке, и после нескольких часов жалких попыток использования gdb мне удалось найти виновника — void Phy802_15_4Timer::start(double wtime)
функция в wpan / p802_15_4phy.cc. Он устанавливает значение uid_ для «nullEvent» равным 0 каждый раз, когда он вызывается И имеет одну ссылку на пакет / событие. Попался! Кроме того, я понял, что виновата реализация CCAHandler, и отследил его до одного вызова метода — void Phy802_15_4::PLME_CCA_request()
в том же файле. Я проверил и, знаете ли вы — обработчик CCAH все еще был активен (флаг активен в Phy802_15_4Timer), когда был вызван его метод запуска (снова)!
Наконец, вот мой вопрос: видя, как другие методы проверяют флаг «active» для других обработчиков перед тем, как фактически вызывать функцию start (и, впоследствии, вызывая метод cancel указанного обработчика, если он активен в этот момент), я изменил код рассматриваемая функция к следующему:
void Phy802_15_4::PLME_CCA_request()
{
if (trx_state == p_RX_ON)
{
// THIS IS WHAT I ADDED - START
if(CCAH.active) {
CCAH.cancel();
}
// THIS IS WHAT I ADDED - END
//perform CCA
//refer to sec 6.7.9 for CCA details
//we need to delay 8 symbols
CCAH.start(4/getRate('s')); // 2.32 change: start CCA at the end of 4th symbol
}
else
mac->PLME_CCA_confirm(trx_state);
}
С этим изменением я больше не получаю ошибок (ууу!). Но я не уверен, является ли это действительным изменением … Мои знания как по NS2, так и по 802.15.4 очень ограничены, и мне нужно, чтобы это работало, но в то же время я боюсь коснуться чего-либо для риск получить экспериментальные результаты, которые — неправильно!
Это нормальный подход? Любая помощь будет принята с благодарностью!
Задача ещё не решена.
Других решений пока нет …