ucos ii動態建立任務

2021-09-26 23:38:58 字數 1303 閱讀 7762

ucos-ii 是乙個應用比較廣泛的嵌入式實時系統,核心可剝奪,執行時按照任務優先順序進行核心搶占,從而保證了多工的高實時性。並且可應用於許多嵌入式晶元中,比如51微控制器,arm,以及飛思卡爾power 架構的mpc系列晶元等等。

大家都知道 ostaskcreate (void (*task)(void *p_arg),

void *p_arg,

os_stk *ptos,

int8u prio) 函式可用於建立任務,其中ptos指標指向為該任務申請的任務堆疊的棧頂,該堆疊用於在任務排程時儲存cpu暫存器的當前值以及該任務中的區域性變數。 在ucos中為任務申請堆疊其實就是建立乙個陣列,ptos代表該陣列第乙個元素位址或者最後乙個元素位址。所以在給ptos賦值時,需要了解當前所用晶元的堆疊增長方式,即向上增長還是向下增長。若為向上增長方式,則應指向陣列的第乙個元素位址,相反,應指向陣列的最後乙個元素位址。 task指向該任務執行的函式位址,p_arg為task函式的引數。prio為該任務的優先順序。對於優先順序,越小代表優先順序越高。以power架構晶元舉例(部分**),堆疊增長方式為向下增長(即大端模式):

#define stksize 512;

os_stk teststk[stksize];

int main()

void test(void *prg)

}

對於該任務函式,必須是乙個死迴圈,同時,必須要有必要的延時,否則優先順序低的任務將無法得到執行。

以上簡單的說明了任務的建立,但是在很多應用中任務的數量以及任務堆疊的都不是預先知道的,或者有時根據在flash中讀取到的配置資料來靈活的實現多工的建立。下面說明如何實現動態多工的建立。

如果要根據flash中配置的資料,實現多工建立,任務可以用for迴圈建立,但是任務堆疊呢?我們不能提前按照預期的最大任務數量去申請堆疊,因為這樣是對記憶體的浪費。試想一下,如果我們開發的是乙個通用性較強的,可配置引數的嵌入式裝置,如果每乙個物件都按照預想的最大數量去建立,對於嵌入式裝置的記憶體很難滿足要求。

為此,我們可以採用指標陣列的方式,我們只定義乙個os_stk型別的指標陣列:

os_stk * taskstk[12];
然後為其分配記憶體,假設初始執行時從flash中讀到的任務數量為num,並且假設num<12:

int i;

for(i=0;i因為taskstk陣列儲存的是任務堆疊陣列的第乙個元素位址,所以在在傳遞棧頂位址時,需要

taskstk[i]+stksize-1;

關於在ucos-ii動態建立任務及堆疊已經完成,其用到的主要技術就是c/c++陣列指標以及動態變長陣列。

uCOS II任務機制

1 任務是乙個無返回的無窮迴圈。uc os ii總是執行進入就緒狀態的最高優先順序的任務。2 任務是如何排程 切換 的?因為uc os ii總是執行進入就緒狀態的最高優先順序的任務。所以,確定哪個任務優先順序最高,下面該哪個任務執行,這個工作就是由排程器 scheduler 來完成的。任務級的排程是...

ucosii任務切換

osctxsw 和osintctxsw osctxsw 是任務優先順序切換函式,它的作用是先將當前任務的cpu現場儲存到該任務的堆疊中,然後獲得最高優先順序任務的堆疊指標,並從該堆疊中恢復此任務的cpu現場,使之繼續執行,該函式就完成了一次任務切換。osintctxsw 是中斷級的任務切換函式。由於...

uc OS II 多工設計

uc os ii 多工設計 1 設計 開始任務 1 宣告 開始任務 任務塊 設定任務的優先順序 設定任務塊大小 編寫 任務函式 開始任務函式 在main函式中建立開始任務 ostaskcreate void 0,2 其他任務函式編寫 1 設定優先順序和任務塊大小 設定任務的優先順序 設定任務塊大小 ...