資源描述:
《方圓移植uCOS-II_方圓.doc》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、uC/OS-II與NE-STR750的適配簡(jiǎn)介所謂移植就是使實(shí)時(shí)操作系統(tǒng)的內(nèi)核能夠適配微處理器或微控制器。為了便于移植,uC/OS-II的絕大部分都使用C編寫,但是在具體移植時(shí)仍然需要寫一些與具體移植的處理器相關(guān)的C和匯編代碼,特別是當(dāng)uC/OS-II需要操作處理器的寄存器時(shí),只能通過匯編語言進(jìn)行操作。當(dāng)處理器滿足下列條件時(shí),才能夠被移植:1.處理器應(yīng)有一個(gè)相應(yīng)的C編譯器為之編譯生成可重入(可以被中斷)的代碼;2.應(yīng)能使用C代碼禁止和允許中斷;3.處理器必須支持中斷,用戶需要提供一個(gè)在一般頻率(10~100Hz)下的中斷;4.處理器應(yīng)有支持堆棧
2、的硬件,堆棧應(yīng)能存儲(chǔ)相當(dāng)數(shù)量(KB)的數(shù)據(jù);5.處理器應(yīng)有加載(load)和存儲(chǔ)(store)堆棧指針和其它CPU寄存器至堆棧或內(nèi)存的指令。像Motorola6805系列的處理器就無法滿足第4條和第5條要求,所以u(píng)C/OS-II就無法運(yùn)行在這些處理器上了。如下圖所示為移植代碼、uC/OS-II、BSP(BoardSupportPackage板級(jí)支持包)和應(yīng)用程序之間的關(guān)系。圖1:uC/OS-II軟硬件架構(gòu)INCLUDES.H是一個(gè)主頭文件,包含大多數(shù)其它文件都需要的頭文件。OS_CPU.H定義了處理器和移植的實(shí)現(xiàn)所需常量、宏和類型的定義??梢钥?/p>
3、出與ARM處理器和開發(fā)板有直接接觸的是OS_CPU_C.C、OS_CPU_A.ASM、OS_CPU.H、OS_DBG.C和BSP.C、BSP.H文件。這些代碼文件隨具體的處理器或開發(fā)板而改變。其中OS_CPU.H以匯編語言描述了如何在ARM處理器下進(jìn)行任務(wù)切換,包括中斷后的任務(wù)切換。uC/OS-II是一個(gè)實(shí)時(shí)的操作系統(tǒng)。這里對(duì)移植的環(huán)境作出如下設(shè)定:1.uC/OS-II版本至少為V2.77;2.uC/OS-II可以在ARM模式或Thumb模式下運(yùn)行;3.任務(wù)可以調(diào)用ARM模式或Thumb模式下的函數(shù)4.任務(wù)運(yùn)行在SVC模式下(為什么不是SYS模
4、式呢?簡(jiǎn)而言之,SVC模式下可以SPSR以返回恰當(dāng)?shù)哪J剑ˋRM或Thumb));下面將就NE-STR750上的uC/OS-II如何進(jìn)行任務(wù)切換、中斷響應(yīng)和提供板級(jí)支持進(jìn)行討論。任務(wù)切換,OSCtxSw()任務(wù)切換OSCtxSw()的過程如下:1.將處理器的寄存器狀態(tài)壓入任務(wù)堆棧中;2.切換當(dāng)前任務(wù)塊(OSTCBCur)為優(yōu)先級(jí)最高的任務(wù)塊(OSTCBHighRdy);3.從任務(wù)堆棧中彈出新任務(wù)塊的處理器狀態(tài);具體來說,操作系統(tǒng)先將當(dāng)前任務(wù)的處理器的寄存器狀態(tài)(主要是各寄存器的值)壓入堆棧之中。這里要注意的一個(gè)細(xì)節(jié)是,為了識(shí)別當(dāng)前任務(wù)所處的處理
5、器模式(ARM模式或Thumb模式),在壓入當(dāng)前程序狀態(tài)寄存器(CPSR)前,先檢測(cè)當(dāng)前處理器的模式,也就是R14_svc(LR)的最低位(1表示Thumb模式,0表示ARM模式),再設(shè)置CPSR的T控制位,最后才將CPSR壓入任務(wù)堆棧中。保存完處理器的狀態(tài)之后,將任務(wù)堆棧的棧頂指針存入當(dāng)前任務(wù)塊(*OSTCBCur)中,以供以后恢復(fù)之用。圖2:保存當(dāng)前處理器狀態(tài)接著將當(dāng)前任務(wù)塊指針指向具有最高優(yōu)先級(jí)的任務(wù)塊(OSTCBHighRdy),依據(jù)任務(wù)塊中保存的OSTCBStkPtr獲得新任務(wù)的堆棧地址。然后就可以從任務(wù)堆棧中彈出處理器狀態(tài),進(jìn)而執(zhí)行
6、任務(wù)了。圖1:恢復(fù)處理器狀態(tài)當(dāng)操作系統(tǒng)執(zhí)行完中斷時(shí),會(huì)執(zhí)行與OSCtxSw()的后半段——恢復(fù)處理器狀態(tài)——相似的操作OS_IntCtxSw(),即切換到具有最高優(yōu)先級(jí)的任務(wù)執(zhí)行。中斷響應(yīng),OS_CPU_IRQ_ISR()當(dāng)操作系統(tǒng)正在執(zhí)行某一任務(wù)時(shí),ARM處理器處于SVC模式,此時(shí)若有異常響應(yīng)(IRQ)產(chǎn)生,操作系統(tǒng)應(yīng)調(diào)用適當(dāng)?shù)闹袛喾?wù)程序(OS_CPU_IRQ_ISR()),以保存當(dāng)前任務(wù)和處理中斷。程序的大概過程如下:1.將處理器中寄存器的內(nèi)容壓入任務(wù)的堆棧中;2.系統(tǒng)的全局中斷嵌套變量增1;如果是第一層中斷嵌套,將任務(wù)堆棧指針存入任務(wù)塊
7、中;3.執(zhí)行中斷處理程序OS_CPU_IRQ_ISR_Handler();4.調(diào)用OSIntExit()查看是否有優(yōu)先級(jí)更高的任務(wù)需要執(zhí)行,若有,切換執(zhí)行之;5.從任務(wù)堆棧中恢復(fù)中斷前處理器的狀態(tài);圖1:ARM異常向量地址具體來說,當(dāng)處理器識(shí)別到異常響應(yīng)(IRQ)時(shí),會(huì)將PC+4存入R14_irq中,CPSR_svc存入SPSR_irq中,設(shè)置CPSR相關(guān)控制位以禁止IRQ中斷,并切換IRQ模式。與此同時(shí),,處理器會(huì)跳轉(zhuǎn)至IRQ的入口地址0x18執(zhí)行指令LDRPC,[PC,#offset],由于ARM體系結(jié)構(gòu)采用了多級(jí)流水線技術(shù),PC問題指向當(dāng)
8、前指令的下兩條指令的地址,即PC=0x20,借助于EIC,最后執(zhí)行OS_CPU_IRQ_ISR()程序。圖2:IRQ中斷結(jié)構(gòu)圖1:ARM處理器響應(yīng)IR