不少屌丝同学都有相似阅历吧,在运用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)仓库运用率最好在P~�之间,太小糟蹋空间,太大不安全
(3)最好在工程中独自树立一个优先级较低延时较长的使命来测验其它使命的仓库运用情况,不用时能够挂起该使命