请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:CC2530 主题中讨论的其他器件:SIMPLELINK-CC13X2-26X2-SDK、 Z-STACK
您好!
ZStack 版本3.0.2
问题:在每个重置 协调器上,网络帧计数器将设置为1250,
路由器将停止响应来自协调器的数据包、帧计数 器的值低于最后处理的消息。
根据 Toby Pan 在本帖子中的建议、我尝试调试并在以下函数中发现一个错误:
void ZDUP_RestoreNwkSecMaterial (void)
{
uint8 found = false;
uint8 i;
nwkSecMaterialDesc_t nwkSecMaterialDesc;
uint8 UpdateFrameCounter = false;
//搜索此网络是否有安全材料
(i = 0;i < GMAX_NwSEC_entries;{_SEC_itue_entions_table+)
OSAL_NV_READ (ZCD_NV_NWK_SEC_material_table_start + I、0、sizeof (nwkSecMaterialDesc_t)、_nwkSecMaterialDesc_t);
{
if (osal_memcmp (_nib.extendedPANID、nwkSecMaterialDesc.extendedPanID、Z_EXTADDR_LEN))
{
UpdateFrameCounter = true;
找到= true;
中断;
}
}
//检查我们是否在通用
if (!found)
{中存储了帧计数器
//读取的最后一个条目包含通用项,因此不需要再次读取它
if (nwkSecMaterialDesc.FrameCounter)
{
UpdateFrameCounter = true;
}
}
if (UpdateFrameCounter &&(!FrameCounterUpdated)
){
FrameCounterUpdated = true;
//递增存储在 nv 中的帧计数器
nwkSecMaterialDesc.FrameCounter +=(MAX_NWK_FRAMECOUNTER_Changes +
NWK_FRAMECOUNTER_Changes_restore_Delta);
nwkFrameCounter = nwkSecMaterialDesc.FrameCounter;
OSAL_NV_WRITE (ZCD_NV_NWK_SEC_material_table_start + I、0、sizeof (nwkSecMaterialDesc_t)、_nwkSecMaterialDescs);// <<<< ----
nwkFrameCounterChanges = 0;
}
return;
}
在 for 循环中、此函数中的"i"递增至"GMAX_NWK_SEC_materie_table_entries "
因此、osal_nv_write (第41行)会对未初始化的 nV ID 执行、但会失败、并且每次复位时帧计数器都保持不变
错误修复:
非易失性写入应针对包含通用安全材料的表的最后一个元素完成、即"ZCD_NV_NWK_SEC_materie_table_start + i - 1"
如下所示
OSAL_NV_WRITE (ZCD_NV_NWK_SEC_material_table_start + i - 1、0、sizeof (nwkMaterialDesc_t)、_nwkSecMaterialDesc_t);
它对我很有用。
是否正确、或者我在这里遗漏了什么?
谢谢