不少屌絲同學都有類似經歷吧,在使用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
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)最好在工程中單獨建立乙個優先順序較低延時較長的任務來測試其它任務的堆疊使用情況,不用時可以掛起該任務
UC OS II的任務堆疊
堆疊就是一種先入後出的資料結構,在uc os ii作業系統中每乙個任務都會有自己的任務堆疊,那麼什麼是任務堆疊。我的理解是,任務堆疊就是一片空間,它可以儲存一些資訊,因為在作業系統下,程式是併發執行的,也就是說,乙個使用者程式不可能一下子執行完,比如任務1執行了一半,再執行任務2,那麼我們就得把一些...
c osII 系統學習 任務
c os 全稱為micro control operation system 它是一款基於 rom執行的可裁剪搶占式實時多工核心系統。c os 系統一般都擁有臨界 段,所謂臨界 段就是處理時不可分割的 通常進入臨界 段時要開中斷,執行玩完之後立即開啟。實時作業系統為多工系統,當執行乙個任務 執行緒 ...
uC OSii之任務劃分
滿足以下幾個指標將會使軟體設計比較簡潔高效。裝置依賴性劃分 主要是對於一些輸入輸出裝置進行劃分,輸入輸出裝置分為主動型和被動性。主動型有乙個盡可能短的中斷服務程式和乙個與之關聯的任務組成 被動性任務由於不能主動觸發,必須有其他任務通過通訊機制向該裝置發出請求,啟用該裝置的相關任務。此類任務有鍵盤任務...