付費下載
下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
μC/OS-II在80x86上的移本章將介紹如何將μC/OS-II移植到In80x86系列CPU上,本章所介紹的移植和代碼都是PentiumII實際上,將要介紹的移植過程適用于所有與80x86兼容的CPU,如AMD,Cyrix,NECV-系列)等等。以In的為例只是一種更典型的情況。80x86CPU每年的產(chǎn)量有數(shù)百萬,大部分用于個圖F9.1顯示了工作在實模式下的80x86處理器的編程模式。所有的寄存器都是16需要保存寄存器內(nèi)容。圖 80x86實模 寄存器圖80x8161是 的的位乘以(6X,,S,D或1的29.21665,6尋1,08,57664程64段。圖F 使用段寄存器和偏移量寄存器尋址文獻中會經(jīng)常發(fā)現(xiàn)用段地址—偏移量表示地址的方法,例如1000:00FF0x100FF。 Windows95。實在安裝μC/OS-II的時候,安裝程序?qū)押陀布嚓P(guān)的,針對 80x86的代碼安裝 分的代碼可在下述文件中找到:OS_CPU.H,OS_CPU_C.C,和OS_CPU_A.ASM。INCLUDES.H是主頭文件,在所有后綴名為.C的文件的開始都包含INCLUDES.H文件。使用程序L 程L OS#ifdefOSCPU#defineOSCPU程L OS#ifdefOSCPU#defineOSCPUEXT#defineOSCPUEXTextern(與編譯器相關(guān)的內(nèi)容typedefunsignedcharunsignedchar/*無符號8位 char/*帶符號8位unsignedint/*無符號16位 int/*帶符號16位unsignedlong long/*無符號32位/*帶符號32位 單精度浮點 雙精度浮點typedefunsignedintOS_STK;/*堆 寬度為16 #defineBYTEINT8S/*以下定義的數(shù)據(jù)類型是為了與uC/OSV1.xx兼容 #defineUBYTEINT8U/*在uC/OS-II中并沒有實際的用處 #defineWORDINT16S#defineUWORDINT16U#defineLONGINT32S#defineULONG 80x86(實模式大模式編譯*方法 用簡單指令開關(guān)中斷注意,用方法1關(guān)閉中斷,從調(diào)用函數(shù)返回后中斷會重新打開注意將文件OS_CPU_A.ASM中與OSIntCtxSw()相關(guān)的常量從10改到8方法#2:關(guān)中斷前保存中斷被關(guān)閉的狀態(tài)注意將文件OS_CPU_A.ASM中與OSIntCtxSw()相關(guān)的常量從8改到10#defineOS_CRITICAL_METHOD#ifOS_CRITICAL_METHOD==#defineOS_ENTER_CRITICAL()asmCLI/*關(guān)閉中斷*/#defineOS_EXIT_CRITICAL()asmSTI/*打開中斷*/ OS_CRITICAL_METHOD==#defineOS_ENTER_CRITICAL()asm{PUSHF;CLI}/*關(guān)閉中 #defineOS_EXIT_CRITICAL()asmPOPF/*打開中斷 80x86(實模式大模式編譯#defineOS_STK_GROWTH1/*#define0x80/*中斷向量0x80#defineOS_TASK_SW()asm OS_CPU_EXTINT8UOSTickDOSCtr;/*為調(diào)用DOS時鐘中斷而定義的計數(shù)器數(shù)據(jù)類由于不同的處理器有不同的字長,μC/OS-IIBorlandC/C++編譯器,整數(shù)(int)類型數(shù)據(jù)為16位,長整形(long)為32位。為了讀者方便起見,盡管μC/OS-II中沒有用到浮點類型的數(shù),在源代碼中筆者還是提供了浮點類型的定義。80x86BorlandC/C++編譯器中堆棧數(shù)據(jù)類型OS_STK為16位。所有的堆棧都必須用OS_STK。樣,后再打開。從而保護數(shù)據(jù)不被多任務(wù)環(huán)境下的其他任務(wù)或中斷破壞。BorlandC/C++支持嵌方法,如下所述的方法1和方法2。作為一種測試,本書采用了方法1。當然,您可以決定方法用μC/OS-II函數(shù),當函數(shù)返回后,中斷將被打開!嚴格意義上的關(guān)閉中斷應(yīng)該是執(zhí)行方法如果用戶在中斷關(guān)閉的情況下調(diào)用μC/OS-Ⅱ函數(shù),其實是延長了中斷響應(yīng)時間。雖然TS在μC/OS-II就緒任務(wù)的堆棧初始化應(yīng)該模擬一次中斷發(fā)生后的樣子,堆棧中應(yīng)該按進的用戶可用中斷號還有0x4B0x5B0x5D0x66,0x680x6F。如果用戶用的不是算設(shè)為整數(shù)。不幸的是,在PC中,系統(tǒng)缺省的時鐘節(jié)拍頻率是18.20648Hz,這對于的計算和設(shè)置都不方便。本章中,筆者將更改PC的時鐘節(jié)拍頻率到200Hz(間隔5ms)。一方面200Hz鐘節(jié)拍最快也只能到200Hz,而如果是PentiumII處理器,則達到200Hz以上沒有問題。在文件OS_CPU.H的末尾了一個8位變量OSTickDOSCtr,將保存時鐘節(jié)拍發(fā)生的次數(shù),每PC環(huán)境而的,如果在其他非PC的系統(tǒng)中運行μC/OS-II,就不用這種同步方法,直接設(shè)定時tai用戶必須先調(diào)用OSInit(),并且已經(jīng)至少創(chuàng)建了一個任務(wù)(請參考OSTaskCreate()和OSTaskCreate(OSTaskCreateExt圖F 任務(wù)創(chuàng)立時的80x86堆棧結(jié)構(gòu)為了啟動任務(wù),OSStartHighRdy()從任務(wù)控制塊(OS_TCB)[程序L9.3(1)]中找到指向堆棧的指針,然后運行POPDS[程序L9.3(2)],POPES[程序L9.3(3)],POPA[程序清單L9.3(4)],和IRET[程序L9.3(5)]指令。此處筆者將任務(wù)堆棧指針保存在任務(wù)控制塊的_OSStartHighRdy_OSStartHighRdyPROCAX,SEGDS,載入; BX,DWORDPTRDS:OSTCBHighRdy;SS:SP=OSTCBHighRdy- SS, SP, ; ;恢復(fù)任務(wù)環(huán);;;運行任_OSStartHighRdy程L 然后是狀態(tài)字寄存器SW。緊接著用PUSHA[圖F9.4/程序L9.4(2)],PUSHES[圖F9.4/程序L9.4(3)],和PUSHDS[圖F9.4/程序L9.4(4)]保存任務(wù)運行環(huán)境。最后用OSCtxSw()在請注意,此時OSTCBCur指向當前任務(wù)OS_TCBOSTCBHighRdy指向新任務(wù)的OS_TCB程程;PUSHESPUSH;L9.4;AX,SEGDS,載入;BX,DWORDPTRDS:_OSTCBCurES:[BX+2],SSES:[BX+0],;OSTCBCur->OSTCBStkPtr=;CALLFARPTR;AX,WORDPTRDS:_OSTCBHighRdy+2DX,WORDPTRDS:_OSTCBHighRdyWORDPTRDS:_OSTCBCur+2,AXWORDPTRDS:_OSTCBCur,;OSTCBCur= ;AL,BYTEPTRBYTEPTRDS:_OSPrioCur,;OSPrioCur=OSPrioHighRdy;LESBX,DWORDPTRDS: MOVSS,ES:[BX+2]MOVSP,ES:[BX];;載入新任務(wù)的CPU;; 從對外接口函數(shù)OSTaskSwHook()返回后,由于任務(wù)的更替,變量OSTCBHighRdy被拷貝到OSTCBCur中[程序L9.4(7)],同樣,OSPrioHighRdy被拷貝到OSPrioCur中[程序 L9.4(11)],POPA[圖F9.4(9)/程序L9.4(12)]取出其他寄存器的值,最后用中斷返回指令I(lǐng)RET[圖F9.4(10)/L9.4(13)]完成任務(wù)切換。在μC/OS-II由于中斷的產(chǎn)生可能會引起任務(wù)切換,在中斷服務(wù)程序的最后會調(diào)用OSIntExit()函數(shù)檢查任務(wù)就緒狀態(tài),如果需要進行任務(wù)切換,將調(diào)用OSIntCtxSw()。所以圖F 任務(wù)級任務(wù)切換時的80x86堆棧結(jié)構(gòu)發(fā)生,此處不需要再保存CPU寄存器(沒有PUSHA,PUSHES,或PUSHDS);第二,OSIntCtxSw()需_OSIntCtxSw_OSIntCtxSw ;;;IgnorecallstoOSIntExitand;;mentifOS_CRITICAL_METHODis1,seementifOS_CRITICAL_METHODis2,see;AX,SEGDS,載入;BX,DWORDPTRDS:_OSTCBCurES:[BX+2],SSES:[BX+0],;OSTCBCur->OSTCBStkPtr=程L ;;CALLFARPTR;AX,WORDPTRDS:_OSTCBHighRdy+2;OSTCBCur=OSTCBHighRdyDX,WORDPTRDS:_OSTCBHighRdyWORDPTRDS:_OSTCBCur+2,WORDPTRDS:_OSTCBCur,;AL,BYTEPTRBYTEPTRDS:_OSPrioCur,;OSPrioCur= ;LESBX,DWORDPTRDS:OSTCBHighRdy;SS:SP=OSTCBHighRdy-MOVSS,ES:[BX+2]MOVSP,ES:[BX];;載入新任務(wù)的CPU;;;_OSIntCtxSw圖F 中斷級任務(wù)切換時的80x86堆棧結(jié)個優(yōu)先級更高的任務(wù)(調(diào)用OSTaskResume())還可能調(diào)用OSTimeTick()進入OIntxtSETERCRIIAL(可能有不同的操作(見.0302節(jié)),狀態(tài)寄存器W的內(nèi)容有可能被壓入堆棧[圖F.5()]。如果確實要進行任務(wù)切換,指針OSTCHigRdy將指向新的就緒任務(wù)的OS_CB,OIntExt()會調(diào)用OSInttxS()完成任務(wù)切換。注意,調(diào)用OSICtw()會在再一次在堆棧中保存返回地址[圖F9.()]。在進行任務(wù)切換的時候,希望堆棧中只保留一次中斷發(fā)生的任務(wù)環(huán)境(如圖F9.5())(圖F95(2(34))。忽略9.55L9.1。2OSET_CRITCL10;8Onxit一但堆棧指針重新定位后,就被保存到將要被掛起的任務(wù)OS_TCB中[圖F9.5(6)/程序從對外接口函數(shù)OSTaskSwHook()返回后,由于任務(wù)的更替,變量OSTCBHighRdy被拷貝到OSTCBCur中[程序L9.5(4)],同樣,OSPrioHighRdy被拷貝到OSPrioCur中[程序PC環(huán)境下,啟動μC/OS-II之前就已經(jīng)有時鐘中斷發(fā)生了,實際上希望在μC/OS-II初始化完圖 PC中斷向量表項操作可免,因為在DOSOSTickISR()調(diào)用斷中沒有改變?nèi)蝿?wù)的就緒狀態(tài),OSIntExit()將返回調(diào)用者OSTickISR(),最后OSTickISR()voidvoidOSTickISR{Saveprocessorregisters;if(OSTickDOSCtr==0)ChainintoDOSbyexecutingan'INT81H'}elseSendEOIcommandtoPIC(PriorityInterrupt}RestoreprocessorExecuteareturnfrominterruptinstruction}程L OSTickISR()偽碼_OSTickISR;PUSHESPUSH;;保存被中斷任務(wù)的CPU環(huán)AX,SEGDS,載入;INCBYTEPTR 標示uC/OS-II進入中程L9.7;;BYTEPTRBYTEPTRDS:_OSTickDOSCtr,SHORT;每11個時鐘節(jié)拍(18.206Hz)調(diào)用DOS;BYTEPTRDS:_OSTickDOSCtr,SHORT;MOVAL,20HMOVDX,20HOUTDX,;向中斷優(yōu)先級控制器發(fā)送命令,清除標志位;;;CALLFARPTR;CALLFARPTR;POPPOPES;;_OSTickISR;調(diào)用OSTimeTick();標示uC/OS-II;恢復(fù)被中斷任務(wù)的CPU;程序L9.8為18.2Hz的OSTickISR()函數(shù)的偽碼。同樣,函數(shù)開頭要保存所有的CPU寄存序L9.8(6)],執(zhí)行IRET指令返回被中斷的任務(wù)。如果采用8.2Hz的OSTickISR()函數(shù),系統(tǒng)初始化過程就不用調(diào)用PC_SetTickRate()同時將文件OS_CFG.H中的常量voidvoidOSTickISR{Saveprocessorregisters;ChainintoDOSbyexecutingan'INT81H'程L 18.2HzOSTickISR()偽碼RestoreprocessorExecuteareturnfrominterruptinstruction}_OSTickISR_OSTickISR ;;保存被中斷任務(wù)的CPU環(huán) ;AX,SEGDS,;載入; BYTEPTR ;標示uC/OS-II進入中; ;調(diào)用DOS的時鐘中斷處理函; FARPTR;調(diào)用OSTimeTick()函; FARPTR;標示uC/OS-IIof中斷結(jié);;恢復(fù)被中斷任務(wù)的CPU環(huán);;返回被中斷任;程L 18.2Hz的OSTickISR()函數(shù)_OSTickISR 圖 傳遞參數(shù)pdata的堆棧初始化結(jié)程L9.10void*OSTaskStkInit(void(*task)(void*pd),void*pdata,void*ptos,INT16U程L9.10void*OSTaskStkInit(void(*task)(void*pd),void*pdata,void*ptos,INT16U{INT16U=/*'opt'未使用,此處可防止編譯器的警=(INT16U/*載入堆棧指針(1)*stk-(INT16U)FP_SEG(pdata);/*放置向函數(shù)傳遞的參(2)*stk-*stk-*stk-*stk-*stk-*stk-*stk-*stk-*stk-*stk-*stk-*stk-*stk-*stk-*stk-*stk-===============/*函數(shù)返回地址(3)/*SW/*堆棧頂端放置指向任務(wù)代碼的指針(4)/*AX=/*CX=/*DX=/*BX=/*SP=/*BP=/*SI=/*DI=/*ES==/*DS=當前CPU的DSreturn((void}筆者使用的BorlandC/C++編譯器配置為用堆棧而不是寄存器來傳送參數(shù)pdata,此時參的堆棧結(jié)構(gòu)。堆棧中的SW初始化為0x0202,這將使任務(wù)啟動后允許中斷發(fā)生;如果設(shè)為堆棧中還要留出各個寄存器的空間,注意寄存器在堆棧中的位置要和運行指令9.1列出了指定初始化常量的情況下,μC/OS-II占用內(nèi)存的情況,包括數(shù)據(jù)和程序代的說明隨磁盤一起提供給用戶,在安裝μC/OS-II后,查看\SOFTWARE\uCOS-II\Ix836L\DOC\下的ROM-RAM.XLS文件。該文件為Excel文件,需要Office97或更高版本的Excel打開。表μC/OS-內(nèi)存占用配置參值代碼(字節(jié)(字節(jié)551101(參看1
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年中醫(yī)中藥知識競賽試題及答案詳解
- 2026年智能交通系統(tǒng)與車輛控制題庫
- 2026年會計實務(wù)操作技能認證試題集
- 體育產(chǎn)業(yè)新興商業(yè)模式市場前景分析
- 雨課堂學(xué)堂在線學(xué)堂云《動畫項目策劃與執(zhí)行(西安美術(shù)學(xué)院)》單元測試考核答案
- 2025年蘭州航空職業(yè)技術(shù)學(xué)院單招職業(yè)傾向性測試題庫帶答案解析
- 2026年北京戲曲藝術(shù)職業(yè)學(xué)院單招職業(yè)傾向性考試題庫帶答案解析
- 2025年河北管理干部學(xué)院馬克思主義基本原理概論期末考試模擬題及答案解析(奪冠)
- 長春氣候類型和氣候特點
- 2024年黟縣招教考試備考題庫帶答案解析
- 量子科普知識
- 2025至2030中國航空安全行業(yè)市場深度研究與戰(zhàn)略咨詢分析報告
- 華潤燃氣2026屆校園招聘“菁英計劃·管培生”全面開啟備考考試題庫及答案解析
- 2025年醫(yī)院財務(wù)部工作總結(jié)及2026年工作計劃
- 成本管理論文開題報告
- 華潤集團6S管理
- 新建粉煤灰填埋場施工方案
- 2025年提高缺氧耐受力食品行業(yè)分析報告及未來發(fā)展趨勢預(yù)測
- 小學(xué)三年級數(shù)學(xué)判斷題100題帶答案
- 互聯(lián)網(wǎng)運維服務(wù)保障承諾函8篇范文
- 2025年(第十二屆)輸電技術(shù)大會:基于可重構(gòu)智能表面(RIS)天線的相控陣無線通信技術(shù)及其在新型電力系統(tǒng)的應(yīng)用
評論
0/150
提交評論