Mac层发生超过1s的事件处理导致协调器看门狗复位
各位大牛,前阵子我把协调器cc2530加了一个看门狗(1s,系统最大值)用于死机能够重启,我的喂狗有两个操作,一个是在
for(;;) // Forever Loop
#endif
{
osal_run_system();
#ifdef WDT_IN_PM1
FEED_WDT;//add -----wdt
#endif
}
还有一处是在应用层有一个800ms的事件来喂狗,然后很多时候就会莫名重启,最后发现是在入网和退网的时候发生重启,然后我就把看门狗禁用了,在事件处理过程添加调试语句:
void osal_run_system( void )
{
char str[100];
sprintf(str,"runsys_");
uint8 idx = 0;
uint32 startTime=osal_GetSystemClock();
uint32 endTime;
....
do {
if (tasksEvents[idx]) // Task is highest priority that is ready.
{
break;
}
} while (++idx < tasksCnt);
if (idx < tasksCnt)
{
uint16 events;
halIntState_t intState;
HAL_ENTER_CRITICAL_SECTION(intState);
events = tasksEvents[idx];
tasksEvents[idx] = 0; // Clear the Events for this task.
HAL_EXIT_CRITICAL_SECTION(intState);
activeTaskID = idx;
events = (tasksArr[idx])( idx, events );
activeTaskID = TASK_NO_TASK;
HAL_ENTER_CRITICAL_SECTION(intState);
tasksEvents[idx] |= events; // Add back unprocessed events to the current task.
HAL_EXIT_CRITICAL_SECTION(intState);
osalTimeUpdate();
endTime=osal_GetSystemClock();
if(endTime - startTime >800)
{
sprintf(str+strlen(str),"time:%d ,idx = %d,events=%x\n",endTime - startTime,idx,events);
debug_str(str);
}
}
}
主要目的就是为了在处理事件的时候出现大于800ms 的时候把事件的层和events打给host,结果在host监控得到发生0x45 0xca (入网) 或者 0x45 0xc9(退网)的时候:
runsys_time:947 ,idx = 0,events=6
runsys_time:986 ,idx = 0,events=6
runsys_time:1040 ,idx = 0,events=6
事实摆明,确实是存在zstack的某个时间的处理时间会达到甚至超过1s,这就对喂狗产生困难,然后研究这个事件 idx=0 说明是MAC层(tasksEvents数组),然后events = 6 说明是两个事件0x04|0x02合并而来,然而由于MAC闭源 无法得知是哪两个事件.
各位大牛,现在我想知道这是协议栈的BUG或者有没有可能是硬件问题,因为MAC的loop函数不公开 想修改都做不到,如果是协议栈的Bug说明协议栈不能用看门狗了...
各位大牛给支支招吧.
怎么没人回复我啊,我不信就我一个人碰到这问题,,
私信@VV 也没回我,这是要闹哪样啊
自己给自己顶上去,
你debug时候观察看看,是什么时间卡顿影响了喂狗。肯定是由事情卡住了
事实摆明,确实是存在zstack的某个时间的处理时间会达到甚至超过1s,这就对喂狗产生困难,然后研究这个事件 idx=0 说明是MAC层(tasksEvents数组),然后events = 6 说明是两个事件0x04|0x02合并而来,然而由于MAC闭源 无法得知是哪两个事件.
我写了 ,就是Mac层的事件啊,貌似没法优化
你的问题现在解决了吗?
怎么你也碰到这问题了吗.我的已经解决了啊
你是怎么解决的?求分享!
OSAL是有优先级的,如果MAC层一直有事件在产生,就一直无法触发低优先级的事件。建议喂狗在Hal_ProcessPoll中处理。