在使用ucos時,首先需要建立任務,但是如果微控制器ram空間有限的情況下,如何能確保建立的任務棧既能滿足任務需求,又避免任務棧浪費呢?
其實ucos在設計的時候,考慮到了這一點。ucos自帶兩個任務,其優先順序分別為最低和次低,分別為idle
任務和statistics
任務,其中statistics
任務便是可以統計各任務的cpu使用率,也就是任務棧使用情況,因此,我們可以借用該統計任務的函式來統計各任務的棧使用情況。
函式os_taskstatstkchk()
這個函式在統計任務函式os_taskstat()
中被呼叫,用來統計各任務的cpu使用率。
void os_taskstatstkchk (void)
為未使用的棧空間大小,os_stk_data;
osfree
osused
為已使用的棧空間大小。根據此我們可以判斷出任務棧的使用情況。統計舉例
我在乙個執行的任務(該任務優先順序為
5
)中呼叫該函式並在該函式語句處打斷點。
err = ostaskstkchk(5, &stk_data);
待程式執行到此處時,通過觀察
&stk_data
中的值,可以看到該任務棧的實際使用情況。下圖為通過觀測視窗觀察到的使用情況。可以看到
osfree
的值為11
,osused
的值為37
,因為我定義的該任務堆疊大小為48
,因此,此時cpu使用率為
usage = 37/48 = 77 %
也就是說當我定義棧空間為
48
時,能夠保證任務執行且不會造成棧溢位,同時,有將近25%
的棧空間剩餘。任務棧單位及設定原則
ucos規定,任務棧的單位為
os_stk
,根據不同平台有不同的位寬定義,我是用的m0核定義為32
位,也就是4
位元組寬度。因此,上面例子中定義的任務棧為48
時,實際棧空間大小為
size = 48 * 4 = 192 byte
關於定義棧空間原則,以任務使用率占用最大棧空間
50%-80%
為優,太小會造成空間浪費,太大會造成棧溢位。因此,上例中我們測試實際使用為37
,則我們就可以定義該任務棧空間大小為
37 / 0.8 = 46.25
因此我定義為
48
。
struct大小計算
sizeof struct 大小討論 針對位元組對齊,環境使用的gcc version 3.2.2編譯器 32位x86平台 為例。char 長度為1個位元組,short 長度為2個位元組,int 長度為4個位元組。struct 子項在記憶體中的按順序排列,在沒有 progma pack n 引數的情...
struct 大小計算
結構體是一種復合資料型別,通常編譯器會自動的進行其成員變數的對齊,已提高資料訪問的效率。在預設情況下,編譯器為結構體的成員按照自然對齊 natural alignment 條方式分配儲存空間,各個成員按照其宣告順序在儲存器中順序儲存。自然對齊是指按照結構體中成員size最大的對齊,在cl編譯器下可以...
結構體大小計算與位域大小計算
本博文純屬個人理解,有錯誤請多指正。首先,各個變數所佔的位元組 型別位元組 64位 位元組 32位 char11 unsigned char11 short22 unsigned short22 int4 4unsigned int44 long84 unsigned long84 float44 ...