今天调试公司前人留下的程序,发现在使用ucos系统时程序一直进入HardFault_Handler硬件中断,经过排查,猜测可能是因为任务堆栈溢出导致,于是想使用ucos自身任务堆栈检测功能测量一下任务堆栈使用情况,虽然网上查询到了很多检测方法的博客,但是毕竟他有你有不如咱自己也有,所以将测试的方法梳理在本博客,如下:
1、首先要知道一点,ucos有两种创建任务的方法,分为OSTaskCreate()和OSTaskCreateExt()、两者都可以创建任务,OSTaskCreateExt()比前者特点就是允许用户设置更多的细节,如果想测量任务的堆栈大小,必须使用OSTaskCreateExt()创建任务,OSTaskCreate是无法测量的;
2、将需要测量堆栈任务的创建函数后面,要加上OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR,也就是OSTaskCreateExt()函数的最后一个opt参数,截图如下:
3、在需要测量堆栈任务的函数里面调用OSTaskStkChk()函数,例如下图所示:
其中:“ucErr”:为函数返回状态
“2”:为调用该函数的任务优先级(也就是需要测量堆栈使用大小的优先级)
“stk_data”:为存储结果的结构体(需提前定义,定义方法:OS_STK_DATA stk_data;)
4、 OS_STK_DATA结构体包含两个参数,"OSFree"为堆栈中未使用的字节数,"OSUsed“为堆栈中已使用的字节数;
5、还要注意,要将以下宏定义设置为1
#define OS_TASK_CREATE_EXT_EN 1
#define OS_TASK_OPT_STK_CLR 1
6、 读取后根据自己习惯选择读取方法,debug打断点窗口看或串口打印出来都可以,我的读取结果如下(单位:字节):
建议堆栈使用率在50%~80%,太小了浪费空间,太大了有些危险,像我这种28%( 0x484 / ( 0x484 + 0xB7C ) ≈ 28%)目前就很浪费~
瑞思拜~