微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI Zigbee设计交流 > Mac层发生超过1s的事件处理导致协调器看门狗复位

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

时间:10-02 整理:3721RD 点击:

各位大牛,前阵子我把协调器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中处理。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top