不少同學(xué)都有類(lèi)似經(jīng)歷吧,在使用ucosii創(chuàng)建任務(wù)時(shí),關(guān)于任務(wù)堆棧大小設(shè)為多大合適搞的不清不楚,郁悶之下就隨便整個(gè)數(shù),比如就1024吧,反正也沒(méi)見(jiàn)得出問(wèn)題,那就不多想了。
我想大多數(shù)同學(xué)都是這樣做的吧。這樣只是因?yàn)樵谝话闱闆r下,1024確實(shí)已經(jīng)足夠大了,堆棧溢出的可能性很小而已。那么,如果你任務(wù)實(shí)際使用率只有很小的百分之幾,一旦被你知道了,你會(huì)痛心不?我想你不痛心,μC/OS-II也會(huì)痛心的,它會(huì)覺(jué)得這個(gè)coder真是浪費(fèi)啊,哈哈,這其實(shí)還好,至少只是太大導(dǎo)致浪費(fèi)而已,萬(wàn)一小了那可就堆棧溢出——慘啦!順便提醒下大家,堆和棧是完全不同的兩個(gè)概念,出于國(guó)內(nèi)習(xí)慣,還是稱(chēng)之為堆棧罷了!
下面,我就來(lái)告訴大家怎么知道運(yùn)行中任務(wù)的堆棧實(shí)際使用情況,然后就知道應(yīng)該分配多少堆棧大小合適了!開(kāi)始正題。
1、首先需要知道,μC/OS-II中創(chuàng)建任務(wù)的函數(shù)有兩個(gè): OSTaskCreate()和OSTaskCreateExt()
(1)OSTaskCreate() //創(chuàng)建普通任務(wù)
由于重點(diǎn)在下面的創(chuàng)建擴(kuò)展任務(wù)函數(shù),故本函數(shù)就不多說(shuō)了!確實(shí),要想實(shí)現(xiàn)檢測(cè)目標(biāo)任務(wù)棧實(shí)際使用情況的功能,是不能使用這個(gè)函數(shù)來(lái)創(chuàng)建目標(biāo)任務(wù)的,必須使用OSTaskCreateExt() 。
(2)OSTaskCreateExt() //創(chuàng)建擴(kuò)展任務(wù)
函數(shù)接口原型為:
#if OS_TASK_CREATE_EXT_EN > 0
INT8U OSTaskCreateExt
(
void (*task)(void *pd), //建立擴(kuò)展任務(wù)(任務(wù)代碼指針
void *pdata, //傳遞參數(shù)指針
OS_STK *ptos, //分配任務(wù)堆棧棧頂指針
INT8U prio, //分配任務(wù)優(yōu)先級(jí)
INT16U id, //(未來(lái)的)優(yōu)先級(jí)標(biāo)識(shí)(與優(yōu)先級(jí)相同)
OS_STK *pbos, //分配任務(wù)堆棧棧底指針
INT32U stk_size, //指定堆棧的容量(檢驗(yàn)用)
void *pext, //指向用戶(hù)附加的數(shù)據(jù)域的指針
INT16U opt //建立任務(wù)設(shè)定選項(xiàng)
)
#endif
2、其次需要知道μC/OS-II中有這么個(gè)函數(shù):OSTaskStkChk()
不錯(cuò),檢測(cè)任務(wù)堆棧實(shí)際使用情況正是用的這個(gè)函數(shù),下面來(lái)本函數(shù)的接口原型:
INT8U OSTaskStkChk
(
INT8U prio,//待測(cè)任務(wù)的優(yōu)先級(jí)
OS_STK_DATA *pdata //指向一個(gè)類(lèi)型為OS_STK_DATA的結(jié)構(gòu)體
)
3、再次需要知道一個(gè)結(jié)構(gòu)體:
#if OS_TASK_CREATE_EXT_EN > 0
typedef struct
{
INT32U OSFree; //堆棧中未使用的字節(jié)數(shù)
INT32U OSUsed;//堆棧中已使用的字節(jié)數(shù)
} OS_STK_DATA;
#endif
參數(shù): prio 為指定要獲取堆棧信息的任務(wù)優(yōu)先級(jí),也可以指定參數(shù)OS_PRIO_SELF,獲取調(diào)用任務(wù)本身的信息。
pdata 指向一個(gè)類(lèi)型為OS_STK_DATA的數(shù)據(jù)結(jié)構(gòu),其中包含如下信息:
INT32U OSFree; // 堆棧中未使用的字節(jié)數(shù)
INT32U OSUsed; // 堆棧中已使用的字節(jié)數(shù)
4、有了上述三個(gè)知識(shí)點(diǎn)后就可以啦,具體方法為:
(1)將函數(shù)的最后一個(gè)參數(shù)opt 設(shè)置為:
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR
(2)定義一個(gè)變量:OS_STK_DATA StackBytes;
(3)調(diào)用函數(shù)OSTaskStkChk(TestTaskPRIO, &StackBytes)
(4)StackBytes.OSFree的值即為被測(cè)任務(wù)堆棧未使用的字節(jié)數(shù),
StackBytes.OSUsed的值即為被測(cè)任務(wù)堆棧已使用的字節(jié)數(shù)。
5、需要設(shè)置宏:OS_TASK_OPT_STK_CLR為1
6、最后一點(diǎn)建議:
(1)將被測(cè)任務(wù)經(jīng)歷最壞的堆棧使用狀態(tài),測(cè)出來(lái)的使用率才可靠
(2)堆棧使用率最好在%50~%80之間,太小浪費(fèi)空間,太大不安全
(3)最好在工程中單獨(dú)建立一個(gè)優(yōu)先級(jí)較低延時(shí)較長(zhǎng)的任務(wù)來(lái)測(cè)試其它任務(wù)的堆棧使用情況,不用時(shí)可以?huà)炱鹪撊蝿?wù)
-
嵌入式
+關(guān)注
關(guān)注
5096文章
19191瀏覽量
308046 -
μC/OS
+關(guān)注
關(guān)注
1文章
14瀏覽量
7946
原文標(biāo)題:μC/OS-II創(chuàng)建任務(wù)時(shí),任務(wù)堆棧大小設(shè)置搞不清楚?看這里
文章出處:【微信號(hào):gh_c472c2199c88,微信公眾號(hào):嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
rtthread編譯后如何查看堆棧空間使用情況?
CUBEIDE運(yùn)行完可以看RAM的使用情況,運(yùn)行中可以實(shí)時(shí)查看RAM的使用情況嗎?
詳解μC/OS-II如何檢測(cè)任務(wù)堆棧實(shí)際使用情況——即如何設(shè)置ucosii任務(wù)堆棧大小
如何查看RAM使用情況?
ucosiii堆棧使用情況檢測(cè)使用率100%?
STM32 FreeRTOS RAM 使用情況及優(yōu)化方法實(shí)用資料分享~
FreeRTOS中的任務(wù)堆棧溢出檢測(cè)機(jī)制
介紹嵌入式軟件堆棧使用情況的估算方法
電池使用情況統(tǒng)計(jì)信息
如何在Windows 10的任務(wù)管理器中查看電源使用情況
SoC如何查看內(nèi)存使用情況
單片機(jī)整體的CPU使用情況詳細(xì)介紹
![單片機(jī)整體的CPU<b class='flag-5'>使用情況</b>詳細(xì)介紹](https://file.elecfans.com/web1/M00/D1/3F/pIYBAF--FiGAYa7BAAHAqabhgK0988.png)
評(píng)論