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

详解μC/OS-II

如何检测任务堆栈实际使用情况——即如何设置

ucosii

任务堆

栈大小

不少屌丝同学都有类似经历吧,在使用

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)最好在工程中单独建立一个优先级较低延时较长的任务来测试其它任

务的堆栈使用情况,不用时可以挂起该任务。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值