ucos任務棧大小計算,如何高效定義棧空間大小!

2021-08-15 18:24:29 字數 1453 閱讀 5449

在使用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的值為11osused的值為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 ...