<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > μCOSII在Cortex-M3核ARM處理器上的移植

          μCOSII在Cortex-M3核ARM處理器上的移植

          作者: 時(shí)間:2009-03-30 來(lái)源:網(wǎng)絡(luò) 收藏

            目前,嵌入式技術(shù)已被廣泛應(yīng)用到汽車(chē)電子、無(wú)線(xiàn)通信、數(shù)碼產(chǎn)品等各個(gè)領(lǐng)域。嵌入式操作系統(tǒng)及嵌入式處理器技術(shù)發(fā)展迅猛,嵌入式操作系統(tǒng)典型代表有μCOS—II、μClinux、Winclow CE、VxWorks等;嵌入式處理器包括ARM、MIPS、PowerPC等。隨著軟硬件技術(shù)的發(fā)展,人們開(kāi)始意識(shí)到基于嵌入式操作系統(tǒng)的程序開(kāi)發(fā)模式的便利性及可靠性,并且在程序開(kāi)發(fā)過(guò)程中開(kāi)始傾向于從傳統(tǒng)超循環(huán)開(kāi)發(fā)模式轉(zhuǎn)向基于嵌入式操作系統(tǒng)的開(kāi)發(fā)模式。

            1 軟硬件開(kāi)發(fā)環(huán)境及處理器介紹

            1.1 軟件硬開(kāi)發(fā)環(huán)境

            本過(guò)程使用的軟件環(huán)境是RealView MDK開(kāi)發(fā)套件,此產(chǎn)品是ARM公司最新推出的針對(duì)各種嵌入式處理器的軟件開(kāi)發(fā)工具,該開(kāi)發(fā)套件功能強(qiáng)大,包括了μVision3集成開(kāi)發(fā)環(huán)境和RealView編譯器。使用的硬件平臺(tái)是深圳英蓓特公司推出的全功能評(píng)估板STMl03V100,其上所采用的處理器是ST意法半導(dǎo)體公司生產(chǎn)的32位哈佛結(jié)構(gòu)STM32F103VBT6,該處理器內(nèi)置ARM公司最新的Cortex—M3核,并且具有非常豐富的片上資源。

            1.2 關(guān)于基于的介紹

            基于Cortex—M3核的支持兩種模式,分別稱(chēng)為線(xiàn)程模式和處理模式。程序可以在系統(tǒng)復(fù)位時(shí)或中斷返回時(shí)兩種情況下進(jìn)入線(xiàn)程模式,而處理模式只能通過(guò)中斷或異常的方式來(lái)進(jìn)入。處于線(xiàn)程模式中代碼可以分別運(yùn)行在特權(quán)方式下和非特權(quán)方式下。處于處理模式中的代碼總是運(yùn)行在特權(quán)方式下。運(yùn)行在特權(quán)方式下的代碼對(duì)系統(tǒng)資源具有完全訪(fǎng)問(wèn)權(quán),而運(yùn)行在非特權(quán)方式下的代碼對(duì)系統(tǒng)資源的訪(fǎng)問(wèn)權(quán)受到一定限制。處理器可以運(yùn)行在Thumb狀態(tài)或Debug狀態(tài)。在指令流正常執(zhí)行期間,處理器處于Thumb狀態(tài)。當(dāng)進(jìn)行程序調(diào)試時(shí),指令流可以暫停執(zhí)行,這時(shí)處理器處于Debug狀態(tài)。處理器有兩個(gè)獨(dú)立的堆棧指針,分別稱(chēng)為MSP和PSP。系統(tǒng)復(fù)位時(shí)總是處于線(xiàn)程模式的特權(quán)方式下,并且默認(rèn)使用的堆棧指針是MSP。本過(guò)程中假設(shè)任務(wù)總是運(yùn)行在線(xiàn)程模式的特權(quán)方式下且總是使用堆棧指針PSP。

            2 過(guò)程詳解

            2.1 μCOS-II內(nèi)核介紹

            μCOS—II是一個(gè)實(shí)時(shí)可剝奪型操作系統(tǒng)內(nèi)核,該操作系統(tǒng)支持最多64個(gè)任務(wù),但每個(gè)任務(wù)的優(yōu)先級(jí)必須互不相同,優(yōu)先級(jí)號(hào)小的任務(wù)比優(yōu)先級(jí)號(hào)大的任務(wù)具有更高的優(yōu)先級(jí),并且該操作系統(tǒng)總是調(diào)度優(yōu)先級(jí)最高的就緒態(tài)任務(wù)運(yùn)行。此內(nèi)核的代碼是美國(guó)人Jean J.Labrosse用C語(yǔ)言編寫(xiě)的,具有很好的可移植性,其2.52版本通過(guò)了美國(guó)航天航空管理局的安全認(rèn)證,可靠性非常高。文中所述的移植過(guò)程使用的就是該版本的源代碼。

            2.2 開(kāi)始移植

            μCOS—II v2.52的源代碼按照移植要求分為需要修改部分和不需要修改部分。其中需要修改源代碼的文件包括頭文件OS_CPU.H、C語(yǔ)言文件OS_CPU.C以及匯編格式文件OS_CPU_A.ASM。

            2.2.1 修改頭文件OS_CPU.H

            頭文件OS_CPU.H中需要修改的內(nèi)容有與編譯器相關(guān)的數(shù)據(jù)類(lèi)型重定義部分和與處理器相關(guān)的少量代碼。由于本移植過(guò)程中使用的是RealView編譯器,因此通過(guò)查閱此編譯器的相關(guān)說(shuō)明文檔可以得到其所支持的基本數(shù)據(jù)類(lèi)型,據(jù)此修改OS_CPU.H中與編譯器相關(guān)的數(shù)據(jù)類(lèi)型重定義部分。修改后代碼如下所示:

          程序

            其中定義的數(shù)據(jù)類(lèi)型OS_STK指出了處理器堆棧中的數(shù)據(jù)是32位的,OS_CPU_SR指出了處理器狀態(tài)寄存器字長(zhǎng)也為32位。

            頭文件中與處理器相關(guān)部分代碼包括臨界區(qū)訪(fǎng)問(wèn)處理、處理器堆棧增長(zhǎng)方向及任務(wù)切換宏定義。臨界區(qū)代碼訪(fǎng)問(wèn)涉及到全局中斷開(kāi)關(guān)指令,由文獻(xiàn)可以得知關(guān)中斷和開(kāi)中斷可以分別由指令CPSID i和CPSIE i實(shí)現(xiàn),文中臨界段訪(fǎng)問(wèn)處理如下:

          程序

            其中INT_DIS()和INT_EN()分別對(duì)應(yīng)關(guān)中斷和開(kāi)中斷處理過(guò)程。

            根據(jù)文獻(xiàn)可知文中所使用的處理器支持的堆棧為滿(mǎn)遞減方式,即堆棧的增長(zhǎng)方向是從內(nèi)存高地址向低地址方向遞減并且堆棧指針總是指向棧頂?shù)臄?shù)據(jù)。在頭文件OS_CPU.H中相應(yīng)代碼只須修改一條,如下所示

          #define OS_STK_GROWTH1

            此定義中的1代表堆棧方向是向下遞減的。

            頭文件OS_CPU.H中最后一個(gè)要修改的地方是任務(wù)切換宏定義,μCOS—II內(nèi)核就是通過(guò)這個(gè)宏調(diào)用來(lái)觸發(fā)任務(wù)級(jí)的任務(wù)切換。任務(wù)切換一般是通過(guò)陷阱或軟件中斷來(lái)實(shí)現(xiàn)的,在基于Cortex—M3核的處理器中支持一條稱(chēng)為超級(jí)用戶(hù)調(diào)用的指令SVC,此指令是ARM軟件中斷指令SWI的升級(jí)版。此處的宏定義代碼修改為如下形式

          #define OS_TASK_SW()OS_SVC()

            其中OS_SVC()之中包含了SVC指令,它可以由嵌入?yún)R編的方式在C語(yǔ)言代碼中進(jìn)行定義,如下所示

          _asm void OS_SVC(void){SVCOx00}

            以上代碼以嵌入?yún)R編的方式定義了一個(gè)輸入?yún)?shù)和返回值都為空的C語(yǔ)言函數(shù),嵌入?yún)R編的格式在RealView編譯器的說(shuō)明文檔中有詳細(xì)的說(shuō)明。

            2.2.2 修改C語(yǔ)言文件OS_CPU.C

            根據(jù)文獻(xiàn)可知文件OS_CPU.C中有10個(gè)C語(yǔ)言函數(shù)需要編寫(xiě),這些函數(shù)中唯一必要的函數(shù)是OSTaskStkInit,其他9個(gè)函數(shù)必須聲明,但不一定要包含任何代碼。為了簡(jiǎn)潔起見(jiàn),本移植過(guò)程只編寫(xiě)了OSTaskStkInit,此函數(shù)的作用是把任務(wù)堆棧初始化成好像剛發(fā)生過(guò)中斷一樣。要初始化堆棧首先必須了解微處理器在中斷發(fā)生前后的堆棧結(jié)構(gòu),根據(jù)文獻(xiàn)易知微處理器在中斷發(fā)生前后的堆棧結(jié)構(gòu),并且可知寄存器xPSR、PC、LR、R12、R3、R2、R1、RO是中斷時(shí)由硬件自動(dòng)保存的。初始化時(shí)需要注意的地方是xPSR、PC和LR的初值,對(duì)于其他寄存器的初值沒(méi)有特別的要求。xPSR比特位是Thumb狀態(tài)位,初始化時(shí)須置1,否則執(zhí)行代碼時(shí)會(huì)引起一個(gè)稱(chēng)為Invstate的異常,這是因?yàn)閮?nèi)置Cortex—M3核的微處理器只支持Thumb和Thumb2指令集。堆棧中PC和LR須初始化為任務(wù)的入口地址值,這樣才能在任務(wù)切換時(shí)跳轉(zhuǎn)到正確的地方開(kāi)始執(zhí)行。此函數(shù)可以用以下代碼來(lái)實(shí)現(xiàn)

          程序

            2.2.3 修改匯編語(yǔ)言文件OS_CPU_A.ASM

            匯編文件OS_CPU_A.ASM中需要編寫(xiě)的函數(shù)分別為OSStartHighRdy、OSCtxSw、OSIntCtxSw和OSTickISR。第一個(gè)函數(shù)的作用是啟動(dòng)多任務(wù)調(diào)度,此函數(shù)只在操作系統(tǒng)開(kāi)始調(diào)度任務(wù)前執(zhí)行一次,以后不再調(diào)用。按照文獻(xiàn)中所述須將堆棧中的寄存器依次彈出,然后執(zhí)行一條中斷返回指令來(lái)開(kāi)始第一個(gè)用戶(hù)任務(wù)的調(diào)度。但基于Cortex—M3核的ARM處理器在執(zhí)行中斷返回指令時(shí)必須處于處理模式下,否則將會(huì)引起內(nèi)存訪(fǎng)問(wèn)異常。當(dāng)系統(tǒng)上電啟動(dòng)時(shí)或程序重置后,處理器會(huì)進(jìn)入線(xiàn)程模式,而要在函數(shù)OSStartHighRdy中執(zhí)行中斷返回指令就首先需要進(jìn)行模式轉(zhuǎn)換,進(jìn)入處理模式,而進(jìn)行同步可控制模式轉(zhuǎn)換的途徑是超級(jí)用戶(hù)調(diào)用,即通過(guò)SVC指令產(chǎn)生軟件中斷可轉(zhuǎn)換到處理模式。實(shí)際上考慮到此函數(shù)只在啟動(dòng)多任務(wù)調(diào)度開(kāi)始前被調(diào)用一次,并且第一次調(diào)度任務(wù)運(yùn)行時(shí)任務(wù)堆棧中除了xPSR、PC和LR的初值以外,其他寄存器的初值無(wú)關(guān)緊要。因此可以簡(jiǎn)化該函數(shù)的編寫(xiě),只須從第一個(gè)任務(wù)的堆棧中取出該任務(wù)的首地址,然后修改堆棧指針使其指向任務(wù)堆棧中內(nèi)存地址最高處,即相當(dāng)于拋棄任務(wù)堆棧中所有數(shù)據(jù),最后根據(jù)取出的地址直接跳轉(zhuǎn)到任務(wù)入口地址處開(kāi)始執(zhí)行。這樣可以免去軟件中斷和模式切換,從而簡(jiǎn)化了對(duì)此函數(shù)的編寫(xiě)。需要說(shuō)明的是在拋棄任務(wù)堆棧中所用數(shù)據(jù)的同時(shí)也將xPSR的初值拋棄了,但這并不影響第一個(gè)任務(wù)投人運(yùn)行,因?yàn)樵谔D(zhuǎn)到第一個(gè)任務(wù)運(yùn)行之前,指令流是在Thumb狀態(tài)下正常執(zhí)行的,xPSR已經(jīng)有了確定的值。此函數(shù)代碼如下所示

          程序

          BX r0;直接跳轉(zhuǎn)到第一個(gè)任務(wù)的入口地址

            第二個(gè)匯編語(yǔ)言函數(shù)OSCtxSw是任務(wù)級(jí)的任務(wù)切換函數(shù)。若在任務(wù)執(zhí)行過(guò)程中有一個(gè)比當(dāng)前任務(wù)優(yōu)先級(jí)更高的任務(wù)進(jìn)入就緒態(tài),μCOS—II內(nèi)核就會(huì)啟動(dòng)OSCtxSw進(jìn)行任務(wù)切換。該函數(shù)會(huì)保存當(dāng)前任務(wù)狀態(tài),然后恢復(fù)那個(gè)優(yōu)先級(jí)更高的任務(wù)狀態(tài),使之投入運(yùn)行。前述的宏定義#defineOS_TASK_SW()OS_SVC()中的OS_SVC()包含了SVC軟件中斷指令,此中斷的中斷向量應(yīng)該設(shè)為函數(shù)OSCtxSw的入口地址,即OSCtxSw是SVC指令產(chǎn)生中斷的中斷服務(wù)程序,其源代碼如下


          上一頁(yè) 1 2 下一頁(yè)

          關(guān)鍵詞: μCOSII Cortex-M3 ARM處理器 移植

          評(píng)論


          相關(guān)推薦

          技術(shù)專(zhuān)區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();