在這裡記錄下我的ucosii學習過程,我學習的資料是正點原子的stm32f407學習資料。
ucosii是乙個可以基於rom執行的、可裁剪的、搶占式、實時多工核心,具有高度移植性,特別適合微處理器和控制器。也就是一種實時作業系統。
ucosii具有執行效率高、占用空間小,實時效能良好和可拓展性強等特點。
從上圖可以看出,ucosii 的移植,我們只需要修改:os_cpu.h、os_cpu_a.asm 和 os_cpu.c等三個檔案即可,其中:os_cpu.h,進行資料型別的定義,以及處理器相關**和幾個函式原型;os_cpu_a.asm,是移植過程中需要彙編完成的一些函式,主要就是任務切換函式;os_cpu.c,定義一些使用者 hook 函式。
圖中定時器的作用是為 ucosii 提供系統時鐘節拍,實現任務切換和任務延時等功能。這個時鐘節拍os_ticks_per_sec(在os_cfg.h中定義)設定,一般我們設定 ucosii 的系統
時鐘節拍為 1ms~100ms,具體根據你所用處理器和使用需要來設定。
所謂的任務,其實就是乙個死迴圈函式,該函式實現一定的功能,乙個工程可以有很多這樣的任務(最多 255 個),ucosii 對這些任務進行排程管理,讓這些任務可以併發工作(注意不是同時工作!!,併發只是各任務輪流占用 cpu,而不是同時占用,任何時候還是只有 1個任務能夠占用 cpu),這就是 ucosii 最基本的功能。
ucosii 相關的概念需要大家了解一下:任務優先順序,任務堆疊,任務控制塊,任務就緒表和任務排程器。
任務優先順序,這個概念比較好理解,ucos 中,每個任務都有唯一的乙個優先順序。優先順序是任務的唯一標識。在 ucosii 中,使用 cpu 的時候,優先順序高(數值小)的任務比優先順序低的任務具有優先使用權,即任務就緒表中總是優先順序最高的任務獲得 cpu 使用權,只有高優先順序的任務讓出 cpu 使用權(比如延時)時,低優先順序的任務才能獲得 cpu 使用權。ucosii 不支援多個任務優先順序相同,也就是每個任務的優先順序必須不一樣。
任務堆疊,就是儲存器中的連續儲存空間。為了滿足任務切換和響應中斷時儲存 cpu 暫存器中的內容以及任務呼叫其他函式時的需要,每個任務都有自己的堆疊。在建立任務的時候,任務堆疊是任務建立的乙個重要入口引數。
任務控制塊os_tcb,用來記錄任務堆疊指標,任務當前狀態以及任務優先順序等任務屬性。ucosii 的任何任務都是通過任務控制塊(tcb)的東西來控制的,一旦任務建立了,任務控制塊 os_tcb 就會被賦值。每個任務管理塊有 3 個最重要的引數:1,任務函式指標;2,任務堆疊指標;3,任務優先順序;任務控制塊就是任務在系統裡面的身份證(ucosii 通過優先順序識別任務)
任務就緒 表,簡而言之就是用來記錄系統中所有處於就緒狀態的任務。它是乙個位圖,系統中每個任務都在這個點陣圖中佔據乙個進製位,該位置的狀態(1 或者 0)就表示任務是否處於就緒狀態。
任務排程的作用一是在任務就緒表中查詢優先順序最高的就緒任務,二是實現任務的切換。
ucosii 的每個任務都是乙個死迴圈。每個任務都處在以下 5 種狀態之一的狀態下,這 5種狀態是:睡眠狀態、 就緒狀態、 執行狀態、 等待狀態(等待某一事件發生)和中斷服務狀態。
睡眠狀態,任務在沒有被配備任務控制塊或被剝奪了任務控制塊時的狀態。
就緒狀態,系統為任務配備了任務控制塊且在任務就緒中進行了就緒登記,任務已經準備好了,但由於該任務的優先順序比正在執行的任務的優先順序低, 還暫時不能執行,這時任務的狀態叫做就緒狀態。
執行狀態,該任務獲得 cpu 使用權,並正在執行中,此時的任務狀態叫做執行狀態。
等待狀態,正在執行的任務,需要等待一段時間或需要等待乙個事件發生再執行時,該任務就會把 cpu 的使用權讓給別的任務而使任務進入等待狀態。
中斷服務狀態,乙個正在執行的任務一旦響應中斷申請就會中止執行而去執行中斷服務程式,這時任務的狀態叫做中斷服務狀態。
在ucosii中與任務有關的函式:
1 ) 建立任務函式 想讓 ucosii 管理使用者的任務,必須先建立任務。
ostaskcreate和ostaskcreateext,我們一般用ostaskcreat函式來建立任務,
該函式原型為:
ostaskcreate(void(task(voidpd),voidpdata,os_stkptos,intu prio)。
該函式包括 4 個引數:task:是指向任務**的指標;pdata:是任務開始執行時,傳遞給任務的引數的指標;ptos:是分配給任務的堆疊的棧頂指標;prio是分配給任務的優先順序。
每個任務都有自己的堆疊,堆疊必須申明為os_stk型別,並且由連續的記憶體空間組成。可以靜態分配堆疊空間,也可以動態分配堆疊空間。
2 ) 任務刪除函式
所謂的任務刪除,其實就是把任務置於睡眠狀態,並不是把任務**給刪除了。
ucosii、提供的任務刪除函式原型為:int8u ostaskdel(int8u prio);其中引數prio就是我們要刪除的任務的優先順序,可見該函式是通過任務優先順序來實現任務刪除的。
任務不能隨便刪除,必須在確保被刪除任務的資源被釋放的前提下才能刪除!
3 ) 請求任務刪除函式
前面提到,必須確保被刪除任務的資源被釋放的前提下才能將其刪除,所以我們通過向被刪除任務傳送刪除請求,來實現任務釋放自身占用資源後再刪除。ucosii 提供的請
求刪除任務函式原型為:int8u ostaskdelreq(int8u prio);同樣還是通過優先順序來確定被請求刪除任務。
4 ) 改變任務的優先順序函式
ucosii 在建立任務時,會分配給任務乙個優先順序,但是這個優先順序並不是一成不變的,而是可以通過呼叫 ucosii 提供的函式修改。ucosii 提供的任務優先順序修改函式原型為:int8u ostaskchangeprio(int8u oldprio,int8u newprio);
5 ) 任務掛起函式
任務掛起和任務刪除有點類似,但是又有區別,任務掛起只是將被掛起任務的就緒標誌刪除,並做任務掛起記錄,並沒有將任務控制塊任務控制塊鍊錶裡面刪除,也不需要釋
放其資源,而任務刪除則必須先釋放被刪除任務的資源,並將被刪除任務的任務控制塊也給刪了。被掛起的任務,在恢復(解掛)後可以繼續執行。ucosii 提供的任務掛起函式
原型為:int8u ostasksuspend(int8u prio);
6 ) 任務恢復函式
有任務掛起函式,就有任務恢復函式,通過該函式將被掛起的任務恢復,讓排程器能夠重新排程該函式。ucosii 提供的任務恢復函式原型為:int8u ostaskresume(int8u prio);
7 ) 任務資訊查詢
在應用程式中我們經常要了解任務資訊,查詢任務資訊函式原型為:
*int8u ostaskquery(int8u prio,os_tcb pdata);
這個函式獲得的是對應任務的 os_tcb 中內容的拷貝。
從上面這些函式我們可以看出,對於每個任務,有乙個非常關鍵的引數就是任務優先順序prio,在ucos 中,任務優先順序可以用來作為任務的唯一標識,所以任務優先順序對任務而言是唯一的,而且是不可重複的。
高優先順序的任務有優先使用 cpu 的權利
ucosII學習筆記 1
核心結構學習 一.臨界段 critical sections 的臨界段也稱為臨界區。程式執行到臨界區時,不允許有中斷進入,因此在進入臨界區前要關中斷,執行完臨界區馬上開中斷。c os 中的這兩個巨集呼叫分別是 os enter critical 和os exit critical 因為這兩個巨集的定...
ucosII學習筆記
以前很少接觸過嵌入式作業系統,這次因為要嘗試研究ucosii這個嵌入式作業系統,看看自己能不能盡快的會使用它,查詢了不少資料。ucosii學習筆記。以下是nathan.yu的 ucosii學習筆記 整理的不錯,自己先借鑑。ucosii學習筆記 by nathan.yu ucos ii特性 l 可剝奪...
UCOS II學習筆記
1.標頭檔案的配置 include stm32f10x.h include stm32f10x conf.h include ucos ii.h 2.任務堆疊配置 os stk led0 task stk 64 os stk led1 task stk 64 定義兩個任務的堆疊陣列 3.對硬體的配置...