Quantcast
Channel: Zigbee 和 Thread
Viewing all articles
Browse latest Browse all 16978

帖子: Mac层发生超过1s的事件处理导致协调器看门狗复位

$
0
0

各位大牛,前阵子我把协调器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说明协议栈不能用看门狗了...


各位大牛给支支招吧.


Viewing all articles
Browse latest Browse all 16978