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

转载 2017年01月03日 11:49:32

不少屌丝同学都有类似经历吧,在使用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)最好在工程中单独建立一个优先级较低延时较长的任务来测试其它任务的堆栈使用情况,不用时可以挂起该任务

 

ucosii 任务的堆栈使用情况检查函数OSTaskStkChk()的应用方法

本文重点介绍如果使用函数OSTaskStkChk()来检查我们Ucos 系统下各任务堆栈的使用情况。 关于OSTaskStkChk()函数的详细功能介绍和内部实现讲解可以百度一下,网上很多,不是本文重...
  • wchengshen
  • wchengshen
  • 2017年02月03日 09:43
  • 1564

ucosii任务堆栈的作用是什么呢?

第一,当任务运行时,它用来保存一些局部变量; 第二,当任务挂起时,它负责保存任务的运行现场,也就是CPU寄存器的值。 uCOS任务堆栈的深入分析(转) 堆栈作用的就是用来保存局部变量,从...
  • supreme42
  • supreme42
  • 2012年03月27日 00:21
  • 7014

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

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

ucos-iii学习之栈空间大小的确定与检测任务堆栈的溢出

1.栈空间大小的确定 堆栈的大小取决于该任务的需求。设定堆栈大小时,你就需要考虑:所有可能被堆栈调用的函数及其函数的嵌套层数,相关局部变量 的大小,中断服务程序所需要的空间。 2.检测任务堆栈的溢...
  • qq_34401994
  • qq_34401994
  • 2017年09月12日 16:11
  • 274

ucos 任务堆栈

  • 2011年11月29日 10:35
  • 110KB
  • 下载

任务堆栈

每个任务都有自己的堆栈空间。堆栈必须声明为OS_STK类型,并且由连续的内存空间组成。用户可以静态分配堆栈空间(在编译的时候分配)也可以动态地分配堆栈空间(在运行的时候分配)。静态堆栈声明如程序清单 ...
  • u011910350
  • u011910350
  • 2017年03月07日 20:04
  • 306

uCOS-III任务堆栈溢出检测及统计任务堆栈使用量的方法

1. 在操作系统任务设计的时候,通常会遇到一个比较麻烦的问题,也就是任务堆栈大小设定的问题,为此我们我需要知道一些问题: 1.1. 任务堆栈一但溢出,意味着系统的崩溃,在有MMU或者MPU的系统中,对...
  • zsy2020314
  • zsy2020314
  • 2013年08月02日 00:30
  • 7911

ucos II 系统学习之------堆栈理解

第一,当任务运行时,它用来保存一些局部变量; 第二,当任务挂起时,它负责保存任务的运行现场,也就是CPU寄存器的值。 uCOS任务堆栈的深入分析(转) 堆栈作用的就是用来保存局部变量,从...
  • xiaoluoshan
  • xiaoluoshan
  • 2016年05月17日 13:45
  • 774

ucos II 系统学习之------任务堆栈检测

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

操作系统栈溢出检测之ucosII篇

操作系统栈溢出检测之uc/osII篇 Author               :       David Lin (林鹏) E-mail                :        linpe...
  • linpeng12358
  • linpeng12358
  • 2014年11月19日 12:52
  • 1633
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:详解μC/OS-II如何检测任务堆栈实际使用情况——即如何设置ucosii任务堆栈大小
举报原因:
原因补充:

(最多只允许输入30个字)