UCOSII之任务堆栈使用情况检查(通过OSTaskStkChk()函数查看)

      本文重点介绍如果使用函数OSTaskStkChk()函数来检查UCOSII系统下各任务堆栈的使用情况。

1、简单介绍一下OSTaskStkChk()函数参数和返回值:

INT8U OSTaskStkChk(INT8U prio, OS_STK_DATA  *p_stk_data)

参数prio : 被检测任务的优先级,也就是唯一标识被检任务的ID。
参数*p_stk_data:指向OS_STK_DATA 结构体的一个变量指针。

OS_STK_DATA 结构体如下:
typedef struct os_stk_data {
    INT32U  OSFree;                    /* Number of free entries on the stack                          */
    INT32U  OSUsed;                   /* Number of entries used on the stack                        */
} OS_STK_DATA;

返回值:0,表示函数返回成功,即:OS_ERR_NONE
异常返回值如下:
       OS_ERR_PRIO_INVALID :被检测任务的优先级优先级设置错误,可能比最高优先级都高了。要小于最高优先级并大于最低优先级,同时不要和自己检测任务的优先级相同            
       OS_ERR_TASK_NOT_EXIST :你要检测的任务没有被建立或者被分配到一个互斥PIP
       OS_ERR_TASK_OPT:被检任务在建立的时候OSTaskCreateExt函数最后一个参数没有设置为OS_TASK_OPT_STK_CHK 
       OS_ERR_PDATA_NULL:指针'p_stk_data可能为空了(if 'p_stk_data' is a NULL pointer)

2、查看任务堆栈使用情况步骤:
     (1)创建一个静态函数CheckStackTask,用于任务调用。

          这个数的作用有两方面:
          一方面,它调用OSTaskStkChk()函数用于检测UCOSII系统中任务堆栈使用情况。
          另一方面,在检测任务堆栈时这个函数它本身做为一个任务线程,在系统中运行。(下一步将说到它被任务创建函数OSTaskCreateExt()调用。)
示例:
static void CheckStackTask(void* pArg)

{
     u8 err1 =0,err2=0,err3=0,err4=0,err5=0;
     while(1)
     {
           err1=OSTaskStkChk(TASK_PRI_1,&OSTKDataSize1);
          OSTimeDly(100);
          err2=OSTaskStkChk(TASK_PRI_2,&OSTKDataSize2);
          OSTimeDly(100);
          err3=OSTaskStkChk(TASK_PRI_3,&OSTKDataSize3);
          OSTimeDly(100);
          {     
                printf("Task1 FreeStack:%d ,UsedStack:%d ,err:%d\n",OSTKDataSize1.OSFree,OSTKDataSize1.OSUsed,err1);
                printf("Task2 FreeStack:%d ,UsedStack:%d ,err:%d\n",OSTKDataSize2.OSFree,OSTKDataSize2.OSUsed,err2);
                printf("Task3 FreeStack:%d ,UsedStack:%d ,err:%d\n",OSTKDataSize3.OSFree,OSTKDataSize3.OSUsed,err3);
                printf("*******\n\n");
          }
     }
}

      (2)要用创建任务函数OSTaskCreateExt()创建一个任务,用于调用上一步的CheckStackTask()函数。

示例:
#define TASK_STK_SIZE_CHKTASK  64 //(定义任务堆栈,任务堆栈64就够大了)
#define TASK_PRI_CHKTASK   51   //(定义任务优先级,检测任务的优先级,要小于其他被检任务)

OSTaskCreateExt(CheckStackTask, NULL, \
                            &gaTaskCheckTask[TASK_STK_SIZE_CHKTASK-1], TASK_PRI_CHKTASK, TASK_PRI_CHKTASK, \
                             gaTaskCheckTask, TASK_STK_SIZE_CHKTASK, NULL, OS_TASK_OPT_STK_CLR);

       (3)检查被检测任务在创建时的最后一项参数,是不是添加了OS_TASK_OPT_STK_CHK项。

示例:
OSTaskCreateExt(TaskTmp1, NULL, \
                             &gaTaskStkTmp[TASK_STK_SIZE-1], TASK_PRI_1, TASK_PRI_1, \
                             gaTaskStkTmp, TASK_STK_SIZE_1, NULL, OS_TASK_OPT_STK_CLR|OS_TASK_OPT_STK_CHK);


       (4)检查宏OS_TASK_STAT_STK_CHK_EN是否为1,如果不是修改为1。

示例:
#define OS_TASK_STAT_STK_CHK_EN   1u   /*     Check task stacks from statistic task

       (5)最后一点建议:

                 1、将被测任务经历最坏的堆栈使用状态,测出来的使用率才可靠

                 2、堆栈使用率最好在%50~%80之间,太小浪费空间,太大不安全

                 3、最好在工程中单独建立一个优先级较低延时较长的任务来测试其它任务的堆栈使用情况,不用时可以挂起该任务

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值