详解μC/OS-II如何检测任务堆栈实际使用情况——即如何设置ucosii任务堆栈大小

来源:互联网 发布:如何使用java框架 编辑:程序博客网 时间:2024/06/01 08:27

不少屌丝同学都有类似经历吧,在使用ucosii创建任务时,关于任务堆栈大小设为多大合适搞的不清不楚,郁闷之下就随便整个数,比如就1024吧,呵呵,反正也没见得出问题,那就不多想了。

        我想大多数同学都是这样做的吧。这样只是因为在一般情况下,1024确实已经足够大了,堆栈溢出的可能性很小而已。那么,如果你任务实际使用率只有很小的百分之几,一旦被你知道了,你会痛心不?我想你不痛心,μC/OS-II也会痛心的,它会觉得这个coder真是浪费啊,哈哈,这其实还好,至少只是太大导致浪费而已,万一小了那可就堆栈溢出——惨啦!顺便提醒下大家,堆和栈是完全不同的两个概念,出于国内习惯,还是称之为堆栈罢了!

        下面,我就来告诉大家怎么知道运行中任务的堆栈实际使用情况,然后就知道应该分配多少堆栈大小合适了!开始正题。

1、首先需要知道,μC/OS-II中创建任务的函数有两个: OSTaskCreate()和OSTaskCreateExt()

(1)OSTaskCreate() //创建普通任务 

        由于重点在下面的创建扩展任务函数,故本函数就不多说了!确实,要想实现检测目标任务栈实际使用情况的功能,是不能使用这个函数来创建目标任务的,必须使用OSTaskCreateExt() 。

(2)OSTaskCreateExt() //创建扩展任务

函数接口原型为:

#if OS_TASK_CREATE_EXT_EN > 0
INT8U OSTaskCreateExt

(

        void (*task)(void *pd), //建立扩展任务(任务代码指针
        void *pdata, //传递参数指针
        OS_STK *ptos, //分配任务堆栈栈顶指针
        INT8U prio, //分配任务优先级
        INT16U id, //(未来的)优先级标识(与优先级相同)
        OS_STK *pbos, //分配任务堆栈栈底指针
        INT32U stk_size, //指定堆栈的容量(检验用)
        void *pext, //指向用户附加的数据域的指针
        INT16U opt //建立任务设定选项

)
#endif

2、其次需要知道μC/OS-II中有这么个函数:OSTaskStkChk()

        不错,检测任务堆栈实际使用情况正是用的这个函数,下面来本函数的接口原型:

INT8U OSTaskStkChk

(

        INT8U prio,  //待测任务的优先级

       OS_STK_DATA *pdata //指向一个类型为OS_STK_DATA的结构体

)

3、再次需要知道一个结构体:

#if OS_TASK_CREATE_EXT_EN > 0
typedef struct

{
        INT32U OSFree; //堆栈中未使用的字节数
        INT32U OSUsed; //堆栈中已使用的字节数
} OS_STK_DATA;
#endif

参数: prio 为指定要获取堆栈信息的任务优先级,也可以指定参数OS_PRIO_SELF,获取调用任务本身的
信息。
pdata 指向一个类型为OS_STK_DATA的数据结构,其中包含如下信息:
INT32U OSFree; // 堆栈中未使用的字节数
INT32U OSUsed; // 堆栈中已使用的字节数

4、有了上述三个知识点后就可以啦,具体方法为:

(1)将函数的最后一个参数opt 设置为:OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR

(2)定义一个变量:OS_STK_DATA  StackBytes;

(3)调用函数OSTaskStkChk(TestTaskPRIO, &StackBytes)

(4)StackBytes.OSFree的值即为被测任务堆栈未使用的字节数,

         StackBytes.OSUsed的值即为被测任务堆栈已使用的字节数。

5、需要设置宏:OS_TASK_OPT_STK_CLR为1

6、最后一点建议:

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

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

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

 

1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 出境章没有盖怎么办 过海关没有盖章怎么办 中国入境没盖章怎么办 护照有效期写错怎么办 回国海关电子盖章怎么办 户籍在学校怎么办护照 割过双眼皮护照怎么办 想换电子护照怎么办 有美签的护照丢失怎么办 护照在国外掉了怎么办 上海动迁房户口怎么办 政府强制拆房怎么办 农村无证宅基地怎么办 身份证没磁怎么办护照 买安置房怎么办产权 安置房房东违约怎么办 安置房产权到期怎么办 安置房怎么办房产证吗 美甲后指甲长了怎么办 在菲律宾怎么办持枪证? 绝地求生打不准怎么办 身份证号码变更后社保怎么办 社保与身份不符怎么办 年龄改了学籍怎么办 结婚证信息错误怎么办 六级身份证过期怎么办 身份号泄露了怎么办 身体证信息泄露怎么办 手机号被泄漏了怎么办 姓名和电话泄露怎么办 个人身份证信息泄露怎么办 身份号码泄露了怎么办 我身份证泄露了怎么办 身份证信息泄漏了怎么办 无锡身份证丢了怎么办 人在外地怎么办身份证 欠空放公司不还怎么办 兼职要身份证照片怎么办 身份证刷不了磁怎么办 身份证不能刷了怎么办 身份证指纹错了怎么办