您的位置:首页 > 其它

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

2017-12-26 11:24 676 查看
详解μ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)最好在工程中单独建立一个优先级较低延时较长的任务来测试其它任
务的堆栈使用情况,不用时可以挂起该任务。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  UCOSII 栈分配