ucosii在stm32上的移植詳解2
下面說(shuō)說(shuō)我對(duì)ucosii的理解。應(yīng)該說(shuō)ucosii這個(gè)內(nèi)核還是比較簡(jiǎn)單的,基本可以分為任務(wù)調(diào)度,任務(wù)同步和內(nèi)存管理三個(gè)部分。
本文引用地址:http://m.butianyuan.cn/article/201611/318071.htm任務(wù)調(diào)度
ucosii為保證實(shí)時(shí)性,給每個(gè)任務(wù)分配一個(gè)不同的優(yōu)先級(jí)。當(dāng)發(fā)生任務(wù)切換時(shí),總是切換到就緒的最高優(yōu)先級(jí)任務(wù)。有2種情況會(huì)發(fā)生任務(wù)切換。
1.任務(wù)等待資源就緒或自我延時(shí);
2.退出中斷;
情況1可以理解為任務(wù)主動(dòng)放棄cpu的使用權(quán)。
情況2可以理解為中斷后,某種資源可能就緒了,需要任務(wù)切換。
需要注意的是SysTick中斷,這個(gè)中斷是os的“心跳”,必須得有。這樣就使得cpu會(huì)發(fā)生周期性地做任務(wù)切換。由于ucosii不支持時(shí)間片輪轉(zhuǎn)調(diào)度,因此在該中斷中必須做的工作僅有os的時(shí)間管理。也就是調(diào)用OSTimeTick()。
任務(wù)同步
任務(wù)同步和大多數(shù)操作系統(tǒng)的做法差不多,如果學(xué)過(guò)操作系統(tǒng)或是有多線(xiàn)程編程經(jīng)驗(yàn)的話(huà),應(yīng)該很好理解。無(wú)非是任務(wù)A因?yàn)槟硞€(gè)資源未就緒,就放棄cpu使用權(quán),等任務(wù)B或是中斷使該資源就緒,當(dāng)再次任務(wù)進(jìn)行切換時(shí)如果任務(wù)A優(yōu)先級(jí)最高,則任務(wù)A繼續(xù)執(zhí)行。具體怎么實(shí)現(xiàn)就看邵老師的書(shū)吧。
內(nèi)存管理
ucosii的內(nèi)存管理比較簡(jiǎn)單,就不說(shuō)了。
下面看看ucosii代碼組成:
os_core.c是ucosii的核心,它包含了內(nèi)核初始化,任務(wù)切換,事件塊管理等,其中事件塊是各個(gè)同步量(這里我把互斥量,信號(hào)量,郵箱,隊(duì)列統(tǒng)稱(chēng)為同步量,不是很科學(xué),圖個(gè)方便。事件標(biāo)志組不是以事件塊為基礎(chǔ)的,不過(guò)原理也差不多)的基礎(chǔ)。
os_task.c
任務(wù)管理代碼。
os_flag.c
os_mbox.c
os_mutex.c
os_q.c
os_sem.c
各個(gè)同步量管理代碼。
os_mem.c
內(nèi)存管理代碼。
os_time.c
時(shí)間管理代碼,主要做各種延時(shí)。
os_tmr.c
定時(shí)器管理代碼,這部分代碼時(shí)從V2.81版才開(kāi)始有的,邵老師的書(shū)講的是V2.55版的代碼,是沒(méi)有這部分內(nèi)容的。如果前面的代碼都理解的話(huà),這部分代碼也是不難理解的。一個(gè)定時(shí)器大體由3部分組成:定時(shí)時(shí)間,回調(diào)函數(shù)和屬性。當(dāng)定時(shí)時(shí)間到了的話(huà),就進(jìn)行一次回調(diào)函數(shù)的處理,定時(shí)器屬性說(shuō)明定時(shí)器是周期性的定時(shí)還是只做一次定時(shí)。如果用戶(hù)使能了OS_TMR_EN,ucosii會(huì)在內(nèi)部創(chuàng)建一個(gè)定時(shí)器任務(wù),負(fù)責(zé)處理各個(gè)定時(shí)器。這個(gè)任務(wù)一般應(yīng)該由硬件定時(shí)器的中斷函數(shù)中調(diào)用OSTmrSignal()去激活。所以從本質(zhì)上說(shuō)os_tmr.c中的定時(shí)器是由一個(gè)硬件定時(shí)器分化出來(lái)的。
默認(rèn)情況下是由SysTick中斷里通過(guò)OSTimeTickHook()去激活定時(shí)器任務(wù)的。
移植相關(guān)文件
os_cpu.h:
進(jìn)行數(shù)據(jù)類(lèi)型定義,處理器相關(guān)代碼和幾個(gè)函數(shù)原型。
os_cpu_c.c:
定義一些用戶(hù)hook函數(shù)。
os_cpu_a.asm:
移植需要用匯編代碼完成的函數(shù),主要就是任務(wù)切換函數(shù)。
os_dbg.c:
內(nèi)核調(diào)試相關(guān)數(shù)據(jù)和函數(shù),可以不改。
ucosii內(nèi)核就介紹到這里。
評(píng)論