我正在尝试模拟大量随机生成的802.15.4网络。我启动250个FFD,最多50个RFD和一个PAN协调器。传输范围设置为40米,拓扑尺寸为500米x 500米,模拟在19世纪(30分钟)后结束。每个RFD从0开始创建一个到PAN协调器的CBR链路,并以2s的间隔发送所有模拟。数据包大小为70 [字节]。
现在,对于重要的部分 - 因为它是一个“大型”模拟,我使用“调度程序/堆”调度程序。我说这很重要,因为我开始得到表格的错误(回想起来,可能并不重要,但是市长的线索是错误的!):
“ns:调度程序从'x'到'y'的时间倒退”
因此,通常,我会在搜索答案时忘记scheduler.cc,scheduler.h和heap.h文件。经过整整12个小时的调试(我既不是熟练的Linux用户,也不是一个优秀的c ++程序员),我终于找到了原因/症状 - 堆中已经包含的数据包会改变(增加)它的时间值。当然,这会完全搞乱堆结构,最终会提取和处理这个数据包,但下一个数据包会失败,因为它的时间值会更小。
现在,这种行为是一个引用变化的迹象,经过几个小时的可怜尝试使用gdb后,我设法找到了罪魁祸首 - wpan / p802_15_4phy中的void Phy802_15_4Timer::start(double wtime)
函数.CC。每次调用它时,它都会将“nullEvent”的uid_设置为0,并且它具有单个数据包/事件引用。疑难杂症!此外,我发现CCAHandler实现是责备并将其跟踪到同一文件中的单个方法调用 - void Phy802_15_4::PLME_CCA_request()
。我查了一下,你知道吗 - 当它的start方法被调用时,CCAH处理程序仍处于活动状态(在Phy802_15_4Timer中标记为活动状态)!
最后,这是我的问题:看到其他方法在实际调用start函数之前检查其他处理程序的“active”标志(并且随后,如果它在那一刻处于活动状态,则调用所述处理程序的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的了解非常有限,我需要这个才能工作,但与此同时,我害怕触摸任何东西获得实验结果的风险 - 错误!
这是一个好的方法吗?任何帮助都将非常感激!