UCOSII为一种RTOS,在创建任务时,为任务分配堆栈空间,岜躲怡镌堆栈分配过多会出现浪费内存,但不影响功能。堆栈分配太小,就会出现HardFa锇栀劐箨ult异常,数组访问越界等等问题,最终导致程序崩溃,因此为任务分配适当的内存非常重要。RTOSUCOSII统计任务堆栈使用/剩余大小及使用率,统计出每个任务堆栈使用情况,然后根据统计情况合理分配堆栈空间。
工具/原料
UCOSIIDemo例程
串口调试助手
USB转TTL接口
方法/步骤
1、编写统计任务堆栈使用/剩余大小及使用率的函数。#defineOS_TASK_S哌囿亡噱TAT_EN1u/*Enable(1)orDisable(0)thestatisticsta霜杼厮贿sk*/#defineOS_TMR_EN1u/*Enable(1)orDisable(0)codegenerationforTIMERS*//***********************************************************************************************************************************************函数名:vAppTask_DebugInfo*描述:应用任务调试信息**********************************************************************************************************************************************/staticvoidvAppTask_DebugInfo(void){ OS_TCB*ptcb=&OSTCBTbl[0];//TableTCB OS_STK_DATAstkDat; printf("************************************AppTaskDebugInfo***********************************\r\n"); printf("PrioUsedFreePerTaskName\r\n"); while(ptcb!=NULL) { OSTaskStkChk(ptcb->OSTCBPrio,&stkDat);//Checktaskstack printf("%2d%5d%5d%02d%%%s\r\n",ptcb->OSTCBPrio,stkDat.OSUsed,stkDat.OSFree,(stkDat.OSUsed*100)/(stkDat.OSUsed+stkDat.OSFree),ptcb->OSTCBTaskName); ptcb=ptcb->OSTCBPrev;//PreviousTCBlist } printf("\r\n");}
2、使能设置任务名的宏定义OS_TASK_NAME_EN#defineOS_TASK_NAME_EN 1u//Enabletasknames
3、设置任务名称OSTaskNameSet()voidOSTaskNameSet(INT8Uprio,INT8U*pname,INT8U*perr)
4、统计任务堆栈使用/剩余大小及使用率效打印效果如下。*******涯箨唁峦*****************************AppTaskDebugInfo*********忮氽阝另**************************PrioUsedFreePerTaskName631511311%uC/OS-IIIdle622110716%uC/OS-IIStat02510319%uC/OS-IITmr5661482%Start10663466%USART39277327%USART211277327%IWDG12524852%Queue3277327%Debug
5、UCOSII内置任务说明。uC/OS-IIIdle:为UCOSII空闲任务uC/OS-IIStat:为UCOSII统计任务uC/OS-IITmr:为UCOSII软件定时器任务
6、补充说明1.uC/OS-IIIdle为必须任务,不可屏蔽。2.uC/OS-IIStat和uC/OS-IITmr为可屏蔽任务,可通过相应的宏使能。3.OS_TMR_EN为使能uC/OS-IITmr任务的宏。4.OS_TASK_STAT_EN为使能uC/OS-IIStat任务的宏。