




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Port Ucos To HCS12,12,12,12,12,HCS12Written bycaisingbo,移植需求,處理器的C編譯器能產(chǎn)生可重入代碼。 用C語言就可以打開和關(guān)閉中斷。 處理器支持中斷并且能產(chǎn)生定時(shí)中斷。 處理器都支持中斷并能產(chǎn)生定時(shí)中斷。 處理器能支持并容納一定量數(shù)據(jù)的硬件堆棧。 處理器有將堆棧指針和其他CPU寄存器讀出和存儲(chǔ)到堆?;騼?nèi)存中的指令。,C/OS-II在MC9S12單片機(jī)上移植的步驟,基本的配置和定義 移植與處理器相關(guān)的OS_CPU_A.ASM匯編代碼文件, 移植與處理器相關(guān)的OS_CPU_C.C標(biāo)準(zhǔn)C代碼文件 由于CodeWarrior支持在C語言中嵌入?yún)R編
2、,因此,在OS_CPU_A.ASM文件中的幾個(gè)函數(shù)的移植代碼也就都放在OS_CPU_C.C這個(gè)文件中,不依賴編譯器的數(shù)據(jù)類型,#ifndef _TYPES typedef unsigned char BOOLEAN; typedef unsigned char INT8U; /* Unsigned 8 bit quantity */ typedef signed char INT8S; /* Signed 8 bit quantity */ typedef unsigned int INT16U; /* Unsigned 16 bit quantity */ typedef signed in
3、t INT16S; /* Signed 16 bit quantity */ typedef unsigned long INT32U; /* Unsigned 32 bit quantity */ typedef signed long INT32S;/* Signed 32 bit quantity */ typedef float FP32; /* 32 bit floatpoint quantity */ typedef double FP64; /* 64 bit floatpoint quantity */ Typedef unsigned char OS_CPU_SR /*CPU
4、CCRquantity */ #define _TYPES #endif #define OS_STK INT8U,代碼臨界區(qū)函數(shù)OS_ENTER_CRITICAL和OS_ENTER_CRITICAL,程序 92 第一種開關(guān)中斷方法 #if OS_CRITICAL_METHOD = 1 #define OS_ENTER_CRITICAL() asm sei #define OS_EXIT_CRITICAL() asm cli #endif 程序 93第二種開關(guān)中斷方法 #if OS_CRITICAL_METHOD = 2 #define OS_ENTER_CRITICAL() asm pshc
5、; sei #define OS_EXIT_CRITICAL() asm pulc #endif 程序 94第三種開關(guān)中斷方法 #if OS_CRITICAL_METHOD = 3 #define OS_ENTER_CRITICAL() asm tpa; asm sei; asm staa cpu_sr #define OS_EXIT_CRITICAL() asm ldaa cpu_sr; asm tap #endif,OS_TASK_SW()執(zhí)行任務(wù)切換,OS_TASK_SW()是在 C/OS-II從低優(yōu)先級(jí)任務(wù)切換到最高優(yōu)先級(jí)任務(wù)時(shí)被調(diào)用的。它總是在任務(wù)級(jí)代碼中被調(diào)用。 就緒任務(wù)的堆棧初始
6、化應(yīng)該模擬一次中斷發(fā)生后的樣子,堆棧中應(yīng)該按進(jìn)棧次序設(shè)置好各個(gè)寄存器的內(nèi)容。OS_TASK_SW()函數(shù)模擬一次中斷過程,在中斷返回的時(shí)候進(jìn)行任務(wù)切換。MC9S12提供了軟中斷源,同時(shí)也提供了陷阱中斷,這兩個(gè)中斷源都能夠使CPU的所有寄存器入棧,但是由于在監(jiān)控程序里面使用了軟中斷,如果再使用軟中斷源,那么中斷服務(wù)程序不會(huì)調(diào)用我們編寫的移植代碼,從而造成C/OS-II的崩潰,因此這里我們選擇利用陷阱中斷。另外陷阱中斷的中斷服務(wù)程序(ISR)(也稱為例外處理過程)的入口點(diǎn)必須指向函數(shù)OSCtxSw()。,程序 95 #define OS_TASK_SW() asm trap,任務(wù)堆棧的增長(zhǎng)方向,M
7、C9S12處理器的堆棧是由高地址向低地址方向增長(zhǎng)的,所以常量OS_STK_GROWTH必須設(shè)置為1。 程序 96 #define OS_STK_GROWTH 1,函數(shù)OSCtxSw實(shí)現(xiàn)用戶級(jí)上下文切換,OSCtxSw()是一個(gè)任務(wù)級(jí)的任務(wù)切換函數(shù)(在任務(wù)中調(diào)用,區(qū)別于在中斷程序中調(diào)用的OSIntCtxSw())。在C/OS-II中,用戶級(jí)任務(wù)調(diào)度時(shí)會(huì)調(diào)用宏或者函數(shù)OS_TASK_SW()。而OS_TASK_SW()最終會(huì)通過某種途徑調(diào)用函數(shù)OSCtxSw()。在本移植中OS_TASK_SW()為陷阱中斷,因此中斷的中斷服務(wù)子程序便是OSCtxSw(),因此調(diào)用函數(shù)OSCtxSw()的途徑是通過
8、中斷處理函數(shù)實(shí)現(xiàn)的。為了方便更好的理解代碼,這里先介紹本移植設(shè)計(jì)的堆棧結(jié)構(gòu)。堆棧結(jié)構(gòu)如圖 92所示。在發(fā)生陷阱中斷后,CPU除PPAGE外各個(gè)寄存器自動(dòng)入棧,因此不需要另外寫寄存器入棧的程序,只需要將PPAGE寄存器入棧即可,C/OS-II提供的OSCtxSw()函數(shù)原型,void OSCtxSw(void) 保存處理器寄存器; 將當(dāng)前任務(wù)的堆棧指針保存到當(dāng)前任務(wù)的OS_TCB中: OSTCBCur-OSTCBStkPtr = Stack pointer; 調(diào)用用戶定義的OSTaskSwHook(); OSTCBCur = OSTCBHighRdy; OSPrioCur = OSPrioHig
9、hRdy; 得到需要恢復(fù)的任務(wù)的堆棧指針: Stack pointer = OSTCBHighRdy-OSTCBStkPtr; 將所有處理器寄存器從新任務(wù)的堆棧中恢復(fù)出來; 執(zhí)行中斷返回指令; ,interrupt 3 voidOSCtxSw(void) asm ldaa$30 /保存頁面寄存器到堆棧中 -A psha / A-SP ldxOSTCBCur /得到TCB的地址 sts0,x/將SP保存到TCB的第一個(gè)字 / Pointer to currently running TCB OSTaskSwHook();/ 調(diào)用接口函數(shù) OSTCBCur = OSTCBHighRdy;/ 把最高
10、優(yōu)先級(jí)的任務(wù)控制塊傳給當(dāng)前任務(wù)控制塊 OSPrioCur = OSPrioHighRdy; / 把最高優(yōu)先級(jí)的任務(wù)優(yōu)先級(jí)數(shù)傳給當(dāng)前任務(wù)優(yōu)先級(jí) asm ldxOSTCBCur /得到新的TCB的地址 Get the new tasks TCBs address lds0,x /從當(dāng)前任務(wù)控制塊獲得堆棧地址 pula staa$30 /恢復(fù)頁面寄存器 nop rti ,定義函數(shù)OSIntCtxSw實(shí)現(xiàn)中斷級(jí)任務(wù)切換,void OSIntCtxSw(void) 調(diào)整堆棧指針來去掉在調(diào)用: OSIntExit(), OSIntCtxSw()過程中壓入堆棧的多余內(nèi)容; 將當(dāng)前任務(wù)堆棧指針保存到當(dāng)前任務(wù)的
11、OS_TCB中: OSTCBCur-OSTCBStkPtr = 堆棧指針; 調(diào)用用戶定義的OSTaskSwHook(); OSTCBCur = OSTCBHighRdy; OSPrioCur = OSPrioHighRdy; 得到需要恢復(fù)的任務(wù)的堆棧指針: 堆棧指針 = OSTCBHighRdy-OSTCBStkPtr; 將所有處理器寄存器從新任務(wù)的堆棧中恢復(fù)出來; 執(zhí)行中斷返回指令; ,由于在中斷發(fā)生后,PPAGE寄存器和其它的CPU寄存器都已經(jīng)保存過了,因此,這里不需要另外保存。實(shí)際上該函數(shù)的代碼是任務(wù)級(jí)切換函數(shù)的后半部分,實(shí)際代碼如下: 程序 99voidOSIntCtxSw(void)
12、 OSTaskSwHook();/調(diào)用接口函數(shù) Call Hook function OSTCBCur = OSTCBHighRdy;/把最高優(yōu)先級(jí)的任務(wù)控制塊傳給當(dāng)前任務(wù)控制塊 OSPrioCur = OSPrioHighRdy; /把最高優(yōu)先級(jí)的任務(wù)優(yōu)先級(jí)數(shù)傳給當(dāng)前務(wù)優(yōu)先級(jí) asm ldxOSTCBCur /得到新的TCB的地址 lds0,x/從當(dāng)前任務(wù)控制塊獲得堆棧地址 pula staa$30 /恢復(fù)頁面寄存器 restore ppage from stack nop rti ,定義函數(shù)OSTickISR,C/OS-要求用戶提供一個(gè)時(shí)鐘資源來實(shí)現(xiàn)時(shí)間的延時(shí)和期滿功能。時(shí)鐘節(jié)拍應(yīng)該每秒鐘
13、發(fā)生10100次。和C/OS-II中的其他中斷服務(wù)程序一樣,OSTickISR()首先在被中斷任務(wù)堆棧中保存CPU寄存器的值,然后調(diào)用OSIntEnter()。C/OS-II要求在中斷服務(wù)程序開頭調(diào)用OSIntEnter(),其作用是將記錄中斷嵌套層數(shù)的全局變量OSIntNesting加1。如果不調(diào)用OSIntEnter(),直接將OSIntNesting加1也是允許的。隨后,OSTickISR()調(diào)用OSTimeTick(),檢查所有處于延時(shí)等待狀態(tài)的任務(wù),判斷是否有延時(shí)結(jié)束就緒的任務(wù)。在OSTickISR()的最后調(diào)用OSIntExit(),如果在中斷中(或其他嵌套的中斷)有更高優(yōu)先級(jí)的任
14、務(wù)就緒,并且當(dāng)前中斷為中斷嵌套的最后一層。OSIntExit()將進(jìn)行任務(wù)調(diào)度。注意如果進(jìn)行了任務(wù)調(diào)度,OSIntExit()將不再返回調(diào)用者,而是用新任務(wù)的堆棧中的寄存器數(shù)值恢復(fù)CPU現(xiàn)場(chǎng),然后用中斷返回實(shí)現(xiàn)任務(wù)切換。如果當(dāng)前中斷不是中斷嵌套的最后一層,或中斷中沒有改變?nèi)蝿?wù)的就緒狀態(tài),OSIntExit()將返回調(diào)用者OSTickISR(),最后OSTickISR()返回被中斷的任務(wù)。,時(shí)鐘節(jié)拍ISR的原型,void OSTickISR(void) 保存處理器寄存器; 調(diào)用OSIntEnter()或者直接將 OSIntNesting加1; 調(diào)用OSTimeTick(); 調(diào)用OSIntExi
15、t(); 恢復(fù)處理器寄存器; 執(zhí)行中斷返回指令; ,一般情況下應(yīng)該使用硬件定時(shí)器來作為時(shí)鐘中斷源,這個(gè)定時(shí)器可以是與微處理器集成在一個(gè)芯片上的,也可以是分立的。在本次移植中時(shí)鐘節(jié)拍由硬件產(chǎn)生即芯片內(nèi)部實(shí)時(shí)時(shí)鐘的中斷,當(dāng)然必須設(shè)置好實(shí)時(shí)時(shí)鐘的控制寄存器,使芯片在產(chǎn)生相應(yīng)的中斷后,會(huì)調(diào)用相應(yīng)的處理程序。實(shí)時(shí)時(shí)鐘的控制寄存器設(shè)置如下: 程序 911 RTICTL = 0 x70; CRGINT |=0 x80; 因此每秒產(chǎn)生250次中斷,當(dāng)然必須在合適的地方打開實(shí)時(shí)時(shí)鐘的中斷!實(shí)時(shí)時(shí)鐘中斷向量號(hào)為7. 時(shí)鐘節(jié)拍ISR實(shí)際代碼如下:,程序 912 interrupt 7 void OSTickISR(void) asm ldaa$30/save ppage to stack psha OSIntEnter()
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024成都工貿(mào)職業(yè)技術(shù)學(xué)院輔導(dǎo)員招聘筆試真題
- 2025年板栗機(jī)械化剝殼去衣機(jī)項(xiàng)目發(fā)展計(jì)劃
- 第3課時(shí) 按比分配教案 人教版數(shù)學(xué)六年級(jí)上冊(cè)
- 2024年新疆維吾爾自治區(qū)消防救援總隊(duì)招錄消防員真題
- 2025年內(nèi)蒙古事業(yè)單位招聘考試筆試試題【答案】
- 消費(fèi)信貸對(duì)消費(fèi)行為的影響分析
- 消防員工作匯報(bào)
- 項(xiàng)目洞室開挖施工安全防護(hù)措施
- 電話客服實(shí)習(xí)報(bào)告范文4篇
- 2025年物理特性分析產(chǎn)品項(xiàng)目建議書
- 2024年綏陽縣選聘城市社區(qū)工作者筆試真題
- 公文寫作技能題庫及答案
- 2025年廣東省中考語文試卷真題(含答案解析)
- 2025廣西專業(yè)技術(shù)人員公需科目培訓(xùn)考試答案
- 教師職業(yè)道德課件-教師職業(yè)道德
- 金康合同94中英文版
- 《嘔吐的常見原因》PPT課件
- 春夏季傳染病防治知識(shí)
- 機(jī)械制造企業(yè)安全檢查表
- 第二章汽車車身常用材料學(xué)習(xí)教案
- 骨病病理知識(shí)
評(píng)論
0/150
提交評(píng)論