1.项目背景
项目是基于Nxp Mcu+FreeRtos,成品是车机(车载导航系统),在运行过程中某些任务会运行不正常,偶尔造成机器重启
2.问题原因
任务运行栈不够用,导致异常
3.如何分析解决
在任务运行的过程中,我们可以实时监测任务运行过程中剩余的最小任务栈是多少并且打印出来,调用uxTaskGetStackHighWaterMark()此函数即可获取
前提得先打开栈获取宏定义
#define INCLUDE_uxTaskGetStackHighWaterMark 1
然后再任务中获取任务栈大小,返回从任务启动栈空间具有的最小剩余量这个值越是接近 0,说明这个任务快溢出了;
l_stackSize = uxTaskGetStackHighWaterMark(NULL);
if(l_stackSize < 50)
{
l_TempstackSize = l_stackSize;
TracePrintf(TRACE_WARNING, "[Task_PowerMgt-W]:Stack Size:%d\r\n", l_stackSize);
}
千万记住一定要过滤啊,不然你一直去打印任务栈没必要,使得任务运行很慢
建议在前期开发过程中一直保留这个查询,后期可以考虑关闭
也可以打开如下的Hook函数,在任务栈异常时会调用钩子函数进行通知,在钩子函数中进行处理也可以
#if( ( configCHECK_FOR_STACK_OVERFLOW == 1 ) && ( portSTACK_GROWTH < 0 ) )
/* Only the current stack state is to be checked. */
#define taskCHECK_FOR_STACK_OVERFLOW() \
{ \
/* Is the currently saved stack pointer within the stack limit? */ \
if( pxCurrentTCB->pxTopOfStack <= pxCurrentTCB->pxStack ) \
{ \
vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \
} \
}
#endif /* configCHECK_FOR_STACK_OVERFLOW == 1 */