<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 詳解μC/OS-II如何檢測任務(wù)堆棧實(shí)際使用情況

詳解μC/OS-II如何檢測任務(wù)堆棧實(shí)際使用情況

作者: 時(shí)間:2016-11-27 來(lái)源:網(wǎng)絡(luò ) 收藏
不少屌絲同學(xué)都有類(lèi)似經(jīng)歷吧,在使用ucosii創(chuàng )建任務(wù)時(shí),關(guān)于任務(wù)堆棧大小設為多大合適搞的不清不楚,郁悶之下就隨便整個(gè)數,比如就1024吧,呵呵,反正也沒(méi)見(jiàn)得出問(wèn)題,那就不多想了。

我想大多數同學(xué)都是這樣做的吧。這樣只是因為在一般情況下,1024確實(shí)已經(jīng)足夠大了,堆棧溢出的可能性很小而已。那么,如果你任務(wù)實(shí)際使用率只有很小的 百分之幾,一旦被你知道了,你會(huì )痛心不?我想你不痛心,μC/OS-II也會(huì )痛心的,它會(huì )覺(jué)得這個(gè)coder真是浪費啊,哈哈!順便提醒下大家,堆和棧是 完全不同的兩個(gè)概念,出于國內習慣,還是稱(chēng)之為堆棧罷了!

本文引用地址:http://dyxdggzs.com/article/201611/322517.htm

下面,我就來(lái)告訴大家怎么知道運行中任務(wù)的堆棧實(shí)際使用情況,然后就知道應該分配多少堆棧大小合適了!開(kāi)始正題。

1、首先需要知道,μC/OS-II中創(chuàng )建任務(wù)的函數有兩個(gè): OSTaskCreate()和OSTaskCreateExt()

(1)OSTaskCreate() //創(chuàng )建普通任務(wù)

由于重點(diǎn)在下面的創(chuàng )建擴展任務(wù)函數,故本函數就不多說(shuō)了!確實(shí),要想實(shí)現檢測目標任務(wù)棧實(shí)際使用情況的功能,是不能使用這個(gè)函數來(lái)創(chuàng )建目標任務(wù)的,必須使用OSTaskCreateExt() 。

(2)OSTaskCreateExt() //創(chuàng )建擴展任務(wù)

函數接口原型為:

#if OS_TASK_CREATE_EXT_EN > 0
INT8U OSTaskCreateExt

(

void (*task)(void *pd), //建立擴展任務(wù)(任務(wù)代碼指針
void *pdata, //傳遞參數指針
OS_STK *ptos, //分配任務(wù)堆棧棧頂指針
INT8U prio, //分配任務(wù)優(yōu)先級
INT16U id, //(未來(lái)的)優(yōu)先級標識(與優(yōu)先級相同)
OS_STK *pbos, //分配任務(wù)堆棧棧底指針
INT32U stk_size, //指定堆棧的容量(檢驗用)
void *pext, //指向用戶(hù)附加的數據域的指針
INT16U opt //建立任務(wù)設定選項

)
#endif

2、其次需要知道μC/OS-II中有這么個(gè)函數:OSTaskStkChk()

不錯,檢測任務(wù)堆棧實(shí)際使用情況正是用的這個(gè)函數,下面來(lái)本函數的接口原型:

INT8U OSTaskStkChk

(

INT8U prio, //待測任務(wù)的優(yōu)先級

OS_STK_DATA *pdata //指向一個(gè)類(lèi)型為OS_STK_DATA的結構體

)

3、再次需要知道一個(gè)結構體:

#if OS_TASK_CREATE_EXT_EN > 0
typedef struct

{
INT32U OSFree; //堆棧中未使用的字節數
INT32U OSUsed; //堆棧中已使用的字節數
} OS_STK_DATA;
#endif

參數: prio 為指定要獲取堆棧信息的任務(wù)優(yōu)先級,也可以指定參數OS_PRIO_SELF,獲取調用任務(wù)本身的
信息。
pdata 指向一個(gè)類(lèi)型為OS_STK_DATA的數據結構,其中包含如下信息:
INT32U OSFree; // 堆棧中未使用的字節數
INT32U OSUsed; // 堆棧中已使用的字節數

4、有了上述三個(gè)知識點(diǎn)后就可以啦,具體方法為:

(1)將函數的最后一個(gè)參數opt 設置為:OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR

(2)定義一個(gè)變量:OS_STK_DATA StackBytes;

(3)調用函數OSTaskStkChk(TestTaskPRIO, &StackBytes)

(4)StackBytes.OSFree的值即為被測任務(wù)堆棧未使用的字節數,

StackBytes.OSUsed的值即為被測任務(wù)堆棧已使用的字節數。

5、需要設置宏:OS_TASK_OPT_STK_CLR為1

6、最后一點(diǎn)建議:

(1)將被測任務(wù)經(jīng)歷最壞的堆棧使用狀態(tài),測出來(lái)的使用率才可靠

(2)堆棧使用率最好在P~?之間,太小浪費空間,太大不安全

(3)最好在工程中單獨建立一個(gè)優(yōu)先級較低延時(shí)較長(cháng)的任務(wù)來(lái)測試其它任務(wù)的堆棧使用情況,不用時(shí)可以?huà)炱鹪撊蝿?wù)



關(guān)鍵詞: μCOS-II檢測任務(wù)堆

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>