【文章內(nèi)容簡(jiǎn)介】
理器匯編完成。 uCOSII 的全部源代碼量大約是 6000- 7000 行,一共 15 個(gè)文件。將 uCOSII 移植到 ARM處理器上,只需要修改三個(gè)和 ARM 體系結(jié)構(gòu)相關(guān)的文件,代碼量大約是 500 行。 應(yīng) 用 軟 件( 用 戶 代 碼 )u C O S I I( 與 處 理 器 類 型 無 關(guān) 的 代 碼 )O S _ C O R E . CO S _ F L A G . CO S _ M B O X . CO S _ M E M . CO S _ M U T E X . CO S _ Q . CO S _ S E M . CO S _ T A S K . CO S _ T I M E . Cu C O S _ I I . Cu C O S _ I I . Hu C O S I I 配 置 文 件( 與 應(yīng) 用 程 序 有 關(guān) )O S _ C F G . HI N C L U D E S . H移 植 u C / O S I I( 與 處 理 器 類 型 有 關(guān) 的 代 碼 )O S _ C P U . HO S _ C P U _ A . A S MO S _ C P U _ C . CC P U 定 時(shí) 器 1. 文件 ? 數(shù)據(jù)類型定義 這部分修改是和所用的編譯器相關(guān)的,不通的編譯器會(huì)使用不同字節(jié)來表示同一數(shù)據(jù)。 ? 堆棧單位 因?yàn)樘幚砥鳜F(xiàn)場(chǎng)的寄存器在任務(wù)切換時(shí) 都將會(huì)保存在當(dāng)前運(yùn)行任務(wù)的堆棧中,所以O(shè)S_STK 數(shù)據(jù)類型應(yīng)該是和處理器的寄存器長(zhǎng)度一致的。 ? 堆棧增長(zhǎng)方向 堆棧有高地址向低地址增長(zhǎng),這個(gè)也是和編譯器有關(guān)的,當(dāng)進(jìn)行函數(shù)調(diào)用時(shí),入口參數(shù)和返回地址一般都會(huì)保存任務(wù)的堆棧中,編譯器的編譯選項(xiàng)和由此生成的 堆棧指令就會(huì)決定堆棧增長(zhǎng)方向。 ? 宏定義 包括開關(guān)中斷的宏定義,以及進(jìn)行任務(wù)切換的宏定義 文件 uCOSII 的移 植范例要求用戶編寫 10 蓋簡(jiǎn)單的 C 函數(shù)。 OSTaskStkInit(); OSTaskCreateHook(); OSTaskDelHook(); OSTaskSwHook(); OSTaskIdleHook(); OSTaskStartHook(); OSTimeTickHook(); OSInitHookBegin(); OSInitHookEnd(); OSTCBInitHook(); ? 任務(wù)堆棧初始化 這里涉及到任務(wù)初始化時(shí)的一個(gè)堆棧設(shè)計(jì),也就是在堆棧增長(zhǎng)方向上如何定義每個(gè)需要保存的寄存器位置,這 樣在 ARM 體系結(jié)構(gòu)下,任務(wù)堆棧空間由高至低依次將保存著 PC, Lr, r12, r11, …… .r1, r0, CPSR、 SPSR,這里需要說明兩點(diǎn),一是當(dāng)前任務(wù)初始化完成后, OSTaskStkInit 返回新的堆棧指針 stk,在 OSTaskCreate()執(zhí)行的時(shí)候會(huì)調(diào)用 OSTaskStkInit 的初始化過程,然后通過 OSTCSInit()函數(shù)調(diào)用將返回的 SP 指針保存到該任務(wù)的 TCB 塊中。 ? 系統(tǒng)的 hook 函數(shù) 沒有特殊要求,則只需簡(jiǎn)單的將它們都實(shí)現(xiàn)為空函數(shù)就可以了。 文件 ? OSStatHighRdy() 此函數(shù)是在 OSStart()多任務(wù)啟動(dòng)之后,負(fù)責(zé)從最高優(yōu)先級(jí)任務(wù)的 TCB 控制塊中獲得該任務(wù)的堆棧指針 SP,通過 SP 依次將 CPU 現(xiàn)場(chǎng)恢復(fù),這時(shí)系統(tǒng)就將控制權(quán)交給用戶創(chuàng)建的該任務(wù)進(jìn)程,直到該任務(wù)被阻塞或者被其它更高優(yōu)先級(jí)的任務(wù)搶占CPU。該函數(shù)僅僅在多任務(wù)啟動(dòng)時(shí)被執(zhí)行一次,用來啟動(dòng)第一個(gè),也就是最高優(yōu)先級(jí)的任務(wù)執(zhí)行,之后多任務(wù)的電鍍和切換就是有下面的函數(shù)來實(shí)現(xiàn)。 ? OSCtxSw 任務(wù)級(jí)的上下文切換,它是當(dāng)任務(wù)因?yàn)楸蛔枞鲃?dòng)請(qǐng)求 CPU 調(diào)度時(shí)被執(zhí)行,由于此時(shí)的任務(wù)切換都是在異常模式下進(jìn)行的,因?yàn)閰^(qū)別于中 斷級(jí)別的任務(wù)切換。它的工作是先將當(dāng)前任務(wù)的 CPU 現(xiàn)場(chǎng)保存到該任務(wù)堆棧中,然后獲得最高優(yōu)先級(jí)任務(wù)的堆棧指針,從該堆棧中回復(fù)任務(wù)的 CPU 現(xiàn)場(chǎng),使之繼續(xù)執(zhí)行,這樣就完成一次任務(wù)的切換。 ? OSIntCtxSw() 中斷級(jí)的任務(wù)切換,它是在時(shí)鐘中斷 ISR(中斷服務(wù)例程)中發(fā)現(xiàn)高優(yōu)先級(jí)任務(wù)等待的時(shí)鐘信號(hào)到來,則需要在中斷退出后并不返回中斷服務(wù),而是直接調(diào)度就緒的高優(yōu)先級(jí)任務(wù)執(zhí)行。這樣做的目的是為了能夠盡快讓高優(yōu)先級(jí)的任務(wù)得到響應(yīng),保證系統(tǒng)的實(shí)時(shí)性。它的原理基本上與任務(wù)級(jí)的切換相同,但是由于進(jìn)入中斷時(shí)已經(jīng) 保存了被中斷任務(wù)的 CPU現(xiàn)場(chǎng) ,因此這里就不用再進(jìn)行類似