ucosii在stm32上的移植詳解2

轉載請註明出處:http://blog.csdn.net/lbl1234

    在詳解1中主要講了移植需要用到的CM3內核知識,本文講一講ucosii的原理和代碼組成。ucosii最經典的學習資料莫過於邵貝貝老師的<<嵌入式實時操作系統uc/os-ii(第2版)>>,我想這本書對學ucosii已經足夠了,因爲他把ucosii V2.55代碼都講了一遍。移植前應該好好看看此書。
    下面說說我對ucosii的理解。應該說ucosii這個內核還是比較簡單的,基本可以分爲任務調度,任務同步和內存管理三個部分。

任務調度
    ucosii爲保證實時性,給每個任務分配一個不同的優先級。當發生任務切換時,總是切換到就緒的最高優先級任務。有2種情況會發生任務切換。
    1.任務等待資源就緒或自我延時;
    2.退出中斷;

    情況1可以理解爲任務主動放棄cpu的使用權。
    情況2可以理解爲中斷後,某種資源可能就緒了,需要任務切換。
    需要注意的是SysTick中斷,這個中斷是os的“心跳”,必須得有。這樣就使得cpu會發生週期性地做任務切換。由於ucosii不支持時間片輪轉調度,因此在該中斷中必須做的工作僅有os的時間管理。也就是調用OSTimeTick()。

任務同步
    任務同步和大多數操作系統的做法差不多,如果學過操作系統或是有多線程編程經驗的話,應該很好理解。無非是任務A因爲某個資源未就緒,就放棄cpu使用權,等任務B或是中斷使該資源就緒,當再次任務進行切換時如果任務A優先級最高,則任務A繼續執行。具體怎麼實現就看邵老師的書吧。

內存管理
    ucosii的內存管理比較簡單,就不說了。

下面看看ucosii代碼組成:
    os_core.c是ucosii的核心,它包含了內核初始化,任務切換,事件塊管理等,其中事件塊是各個同步量(這裏我把互斥量,信號量,郵箱,隊列統稱爲同步量,不是很科學,圖個方便。事件標誌組不是以事件塊爲基礎的,不過原理也差不多)的基礎。

os_task.c
    任務管理代碼。

os_flag.c
os_mbox.c
os_mutex.c
os_q.c
os_sem.c
    各個同步量管理代碼。

os_mem.c
    內存管理代碼。

os_time.c
    時間管理代碼,主要做各種延時。

os_tmr.c
    定時器管理代碼,這部分代碼時從V2.81版纔開始有的,邵老師的書講的是V2.55版的代碼,是沒有這部分內容的。如果前面的代碼都理解的話,這部分代碼也是不難理解的。一個定時器大體由3部分組成:定時時間,回調函數和屬性。當定時時間到了的話,就進行一次回調函數的處理,定時器屬性說明定時器是週期性的定時還是隻做一次定時。如果用戶使能了OS_TMR_EN,ucosii會在內部創建一個定時器任務,負責處理各個定時器。這個任務一般應該由硬件定時器的中斷函數中調用OSTmrSignal()去激活。所以從本質上說os_tmr.c中的定時器是由一個硬件定時器分化出來的。
    默認情況下是由SysTick中斷裏通過OSTimeTickHook()去激活定時器任務的。

移植相關文件
os_cpu.h: 
    進行數據類型定義,處理器相關代碼和幾個函數原型。

os_cpu_c.c: 
    定義一些用戶hook函數。

os_cpu_a.asm: 
    移植需要用匯編代碼完成的函數,主要就是任務切換函數。

os_dbg.c: 
    內核調試相關數據和函數,可以不改。

ucosii內核就介紹到這裏。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章