2023年全國(guó)碩士研究生考試考研英語(yǔ)一試題真題(含答案詳解+作文范文)_第1頁(yè)
已閱讀1頁(yè),還剩31頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、移植μC/OS-Ⅱ,μC/OS-Ⅱ的移植,移植就是使一個(gè)實(shí)時(shí)內(nèi)核能在某個(gè)微處理器或微控制器上運(yùn)行。為了方便移植,大部分的μC/OS-Ⅱ代碼是用C語(yǔ)言寫的;但仍需要用C和匯編語(yǔ)言寫一些與處理器相關(guān)的代碼,這是因?yàn)棣藽/OS-Ⅱ在讀寫處理器寄存器時(shí)只能通過(guò)匯編語(yǔ)言來(lái)實(shí)現(xiàn)。由于μC/OS-Ⅱ在設(shè)計(jì)時(shí)就已經(jīng)充分考慮了可移植性,所以μC/OS-Ⅱ的移植相對(duì)來(lái)說(shuō)是比較容易的。,μC/OS-Ⅱ的移植,要使μC/OS-Ⅱ正常運(yùn)行,處理器必須滿足以下

2、要求:1.處理器的C編譯器能產(chǎn)生可重入代碼。2. 用C語(yǔ)言就可以打開和關(guān)閉中斷。3. 處理器支持中斷,并且能產(chǎn)生定時(shí)中斷(通常在10至100Hz之間)。4. 處理器支持能夠容納一定量數(shù)據(jù)(可能是幾千字節(jié))的硬件堆棧。5. 處理器有將堆棧指針和其它CPU寄存器讀出和存儲(chǔ)到堆?;騼?nèi)存中的指令。像Motorola 6805系列的處理器不能滿足上面的第4條和第5條要求,所以μC/OS-Ⅱ不能在這類處理器上運(yùn)行。

3、,μC/OS-Ⅱ的結(jié)構(gòu)以及與硬件的關(guān)系,μC/OS-Ⅱ的移植,移植工作包括以下幾個(gè)內(nèi)容:用#define設(shè)置一個(gè)常量的值(OS_CPU.H)聲明10個(gè)數(shù)據(jù)類型(OS_CPU.H)用#define聲明三個(gè)宏(OS_CPU.H)用C語(yǔ)言編寫六個(gè)簡(jiǎn)單的函數(shù)(OS_CPU_C.C)編寫四個(gè)匯編語(yǔ)言函數(shù)(OS_CPU_A.ASM)根據(jù)處理器的不同,一個(gè)移植實(shí)例可能需要編寫或改寫50至300行的代碼。,μC/OS-Ⅱ的移植,一旦代碼移植

4、結(jié)束,下一步工作就是測(cè)試。測(cè)試一個(gè)象μC/OS-Ⅱ一樣的多任務(wù)實(shí)時(shí)內(nèi)核并不復(fù)雜。甚至可以在沒(méi)有應(yīng)用程序的情況下測(cè)試,就是讓內(nèi)核自己測(cè)試自己。這樣做有兩個(gè)好處:第一,避免使本來(lái)就復(fù)雜的事情更加復(fù)雜;第二,如果出現(xiàn)問(wèn)題,可以知道問(wèn)題出在內(nèi)核代碼上而不是應(yīng)用程序。開始測(cè)試的時(shí)候可以運(yùn)行一些簡(jiǎn)單的任務(wù)和時(shí)鐘節(jié)拍中斷服務(wù)例程。一旦多任務(wù)調(diào)度成功地運(yùn)行了,再添加應(yīng)用程序的任務(wù)就是非常簡(jiǎn)單的工作了。,移植開發(fā)工具,移植μC/OS-Ⅱ需要一個(gè)C編

5、譯器,并且是針對(duì)用戶用的CPU的。因?yàn)棣藽/OS-Ⅱ是一個(gè)可剝奪型內(nèi)核,用戶只有通過(guò)C編譯器來(lái)產(chǎn)生可重入代碼;C編譯器還要支持匯編語(yǔ)言程序。絕大部分的C編譯器都是為嵌入式系統(tǒng)設(shè)計(jì)的,它包括匯編器、連接器和定位器。連接器用來(lái)將不同的模塊(編譯過(guò)和匯編過(guò)的文件)連接成目標(biāo)文件,定位器則允許用戶將代碼和數(shù)據(jù)放置在目標(biāo)處理器的指定內(nèi)存映射空間中。所用的C編譯器還必須提供一個(gè)機(jī)制來(lái)從C中打開和關(guān)閉中斷。,移植目錄結(jié)構(gòu)和文件,各個(gè)微處理器的移

6、植源代碼必須在以下兩個(gè)或三個(gè)文件中找到:OS_CPU.H,OS_CPU_C.C,OS_CPU_A.ASM。匯編語(yǔ)言文件OS_CPU_A.ASM是可選擇的,因?yàn)槟承〤編譯器允許用戶在C語(yǔ)言中插入?yún)R編語(yǔ)言,所以用戶可以將所需的匯編語(yǔ)言代碼直接放到OS_CPU_C.C中。一個(gè)放置移植實(shí)例的目錄結(jié)構(gòu)如表所示。這樣的目錄結(jié)構(gòu),使用戶更容易找到目標(biāo)處理器的文件。,INCLUDES.H文件,INCLUDES.H是一個(gè)頭文件,它在所有.C文件的第一

7、行被包含。#include "includes.h" INCLUDES.H使得用戶項(xiàng)目中的每個(gè).C文件不用分別去考慮它實(shí)際上需要哪些頭文件。使用INCLUDES.H的唯一缺點(diǎn)是它可能會(huì)包含一些實(shí)際不相關(guān)的頭文件,這樣每個(gè)文件的編譯時(shí)間可能會(huì)增加,但是它增強(qiáng)了代碼的可移植性。用戶可以通過(guò)編輯INCLUDES.H來(lái)增加自己的頭文件,但是用戶的頭文件必須添加在頭文件列表的最后。,OS_CPU.H文件,#i

8、fdef OS_CPU_GLOBALS#define OS_CPU_EXT#else#define OS_CPU_EXT extern#endif /************************************ 數(shù)據(jù)類型 (與編譯器相關(guān))************************************/ typedef unsigned char BOOLEAN

9、;typedef unsigned char INT8U; /* 無(wú)符號(hào)8位整數(shù) (1)/整型數(shù)據(jù)結(jié)構(gòu)既是可移植的又是直觀的 typedef signed char INT8S; /* 有符號(hào)8位整數(shù)typedef unsigned int INT16U; /* 無(wú)符號(hào)16位整數(shù)typedef signed int INT16S; /* 有符號(hào)16位整數(shù)typedef

10、 unsigned long INT32U; /* 無(wú)符號(hào)32位整數(shù)typedef signed long INT32S; /* 有符號(hào)32位整數(shù)typedef float FP32; /* 單精度浮點(diǎn)數(shù) (2)/浮點(diǎn)數(shù)據(jù)類型 typedef double FP64; /* 雙精度浮點(diǎn)數(shù) typedef unsigned int

11、 OS_STK; /* 堆棧入口寬度為16位,用戶所必須要做的就是查看編譯器手冊(cè),并找到對(duì)應(yīng)于μC/OS-Ⅱ的標(biāo)準(zhǔn)C數(shù)據(jù)類型。,OS_CPU.H文件(續(xù)),/************************** 與處理器相關(guān)的代碼*************************/ #define OS_ENTER_CRITICAL() ??? /* 禁止中斷 */ (3)#define

12、 OS_EXIT_CRITICAL() ??? /* 允許中斷 */ #define OS_STK_GROWTH 1 /* 定義堆棧的增長(zhǎng)方向: 1=向下, 0=向上 */(4) /絕大多數(shù)的微處理器和微控制器的堆棧是從上往下長(zhǎng)的,但是某些處理器是用另外一種方式工作的。μC/OS-Ⅱ被設(shè)計(jì)成兩種情況都可以處理。#define OS_TASK_SW() ??? (5)/μC/O

13、S-Ⅱ從低優(yōu)先級(jí)任務(wù)切換到最高優(yōu)先級(jí)任務(wù)時(shí)調(diào)用OS_TASK_SW() 。任務(wù)切換只是簡(jiǎn)單的將處理器寄存器保存到將被掛起的任務(wù)的堆棧中,并且將更高優(yōu)先級(jí)的任務(wù)從堆棧中恢復(fù)出來(lái)。,上述代碼中的???部分,對(duì)于不同的微處理器來(lái)說(shuō),都不一樣。例如通過(guò)執(zhí)行STI命令在Intel 80186上禁止中斷,并用CLI命令來(lái)允許中斷。#define OS_ENTER_CRITICAL() asm CLI#define OS_EXIT_CRIT

14、ICAL() asm STI,OS_CPU_A.ASM文件,μC/OS-Ⅱ的移植實(shí)例要求用戶編寫四個(gè)簡(jiǎn)單的匯編語(yǔ)言函數(shù):OSStartHighRdy()、OSCtxSw()、OSIntCtxSw()、OSTickISR()如果用戶的編譯器支持插入?yún)R編語(yǔ)言代碼的話,用戶就可以將所有與處理器相關(guān)的代碼放到OS_CPU_C.C文件中,而不必再擁有一些分散的匯編語(yǔ)言文件。,OSStartHighRdy(),void OSStartHi

15、ghRdy (void){ Call user definable OSTaskSwHook(); Get the stack pointer of the task to resume: Stack pointer = OSTCBHighRdy->OSTCBStkPtr;

16、 OSRunning = TRUE; Restore all processor registers from the new task's stack; Execute a return from interrupt instruction; },要想運(yùn)行最高優(yōu)先級(jí)任務(wù),用戶所要做的是將所有處理器寄存器按順序從任務(wù)堆棧中恢復(fù)出來(lái),并且執(zhí)行中斷的返回。,注意:OSStart

17、HighRdy()必須調(diào)用OSTaskSwHook(),因?yàn)橛脩粽谶M(jìn)行任務(wù)切換的部分工作——用戶在恢復(fù)最高優(yōu)先級(jí)任務(wù)的寄存器。而OSTaskSwHook()可以通過(guò)檢查OSRunning來(lái)知道是OSStartHighRdy()在調(diào)用它(OSRunning為FALSE)還是正常的任務(wù)切換在調(diào)用它(OSRunning為TRUE)。OSStartHighRdy()還必須在最高優(yōu)先級(jí)任務(wù)恢復(fù)之前和調(diào)用OSTaskSwHook()之后設(shè)置OS

18、Running為TRUE。,OSCtxSw(),任務(wù)級(jí)的切換問(wèn)題是通過(guò)發(fā)軟中斷命令或依靠處理器執(zhí)行陷阱指令來(lái)完成的。中斷服務(wù)例程,陷阱或異常處理例程的向量地址必須指向OSCtxSw()。如果當(dāng)前任務(wù)調(diào)用μC/OS-Ⅱ提供的系統(tǒng)服務(wù),并使得更高優(yōu)先級(jí)任務(wù)處于就緒狀態(tài),μC/OS-Ⅱ就會(huì)借助上面提到的向量地址找到OSCtxSw()。在系統(tǒng)服務(wù)調(diào)用的最后,μC/OS-Ⅱ會(huì)調(diào)用OSSched(),并由此來(lái)推斷當(dāng)前任務(wù)不再是要運(yùn)行的最重要的任

19、務(wù)了。OSSched()先將最高優(yōu)先級(jí)任務(wù)的地址裝載到OSTCBHighRdy中,再通過(guò)調(diào)用OS_TASK_SW()來(lái)執(zhí)行軟中斷或陷阱指令。注意:變量OSTCBCur早就包含了指向當(dāng)前任務(wù)的任務(wù)控制塊(OS_TCB)的指針。軟中斷 (或陷阱) 指令會(huì)強(qiáng)制一些處理器寄存器(比如返回地址和處理器狀態(tài)字)到當(dāng)前任務(wù)的堆棧中,并使處理器執(zhí)行OSCtxSw()。,OSCtxSw()的原型程序,void OSCtxSw(void){ 保存處

20、理器寄存器; 將當(dāng)前任務(wù)的堆棧指針保存到當(dāng)前任務(wù)的OS_TCB中: OSTCBCur->OSTCBStkPtr = Stack pointer; 調(diào)用用戶定義的OSTaskSwHook(); OSTCBCur = OSTCBHighRdy; OSPrioCur = OSPrioHighRdy; 得到需要恢復(fù)的任務(wù)的堆棧指針: Stack poi

21、nter = OSTCBHighRdy->OSTCBStkPtr; 將所有處理器寄存器從新任務(wù)的堆棧中恢復(fù)出來(lái); 執(zhí)行中斷返回指令; },上述這些代碼必須寫在匯編語(yǔ)言中,因?yàn)橛脩舨荒苤苯訌腃中訪問(wèn)CPU寄存器。注意在OSCtxSw()和用戶定義的函數(shù)OSTaskSwHook()的執(zhí)行過(guò)程中,中斷是禁止的。,OSIntCtxSw(),OSIntExit()通過(guò)調(diào)用OSIntCtxSw()來(lái)從ISR中執(zhí)行切換功能

22、,所有的處理器寄存器都被正確地保存到了被中斷的任務(wù)的堆棧之中。實(shí)際上除了我們需要的東西外,堆棧結(jié)構(gòu)中還有其它的一些東西。OSIntCtxSw()必須要清理堆棧,這樣被中斷的任務(wù)的堆棧結(jié)構(gòu)內(nèi)容才能滿足我們的需要。,在ISR執(zhí)行過(guò)程中的堆棧內(nèi)容,當(dāng)中斷來(lái)臨的時(shí)候,處理器會(huì)結(jié)束當(dāng)前的指令,識(shí)別中斷并且初始化中斷處理過(guò)程,包括將處理器的狀態(tài)寄存器和返回被中斷的任務(wù)的地址保存到堆棧中(1)。接著,CPU會(huì)調(diào)用正確的ISR,要求用戶的ISR在開

23、始時(shí)要保存剩下的處理器寄存器(2)。μC/OS-Ⅱ要求用戶的ISR在完成中斷服務(wù)的時(shí)候調(diào)用OSIntExit(),導(dǎo)致調(diào)用者的返回地址被保存到被中斷的任務(wù)的堆棧中(3)。處理器的狀態(tài)寄存器會(huì)被保存到被中斷的任務(wù)的堆棧中(4)。調(diào)用OSIntCtxSw()使返回地址被保存到被中斷的任務(wù)的堆棧中(5)。,OSIntCtxSw()的原型程序,void OSIntCtxSw(void){ 調(diào)整堆棧指針來(lái)去掉在調(diào)用:

24、OSIntExit(), OSIntCtxSw()過(guò)程中壓入堆棧的多余內(nèi)容; 將當(dāng)前任務(wù)堆棧指針保存到當(dāng)前任務(wù)的OS_TCB中: OSTCBCur->OSTCBStkPtr = 堆棧指針; 調(diào)用用戶定義的OSTaskSwHook(); OSTCBCur = OSTCBHighRdy; OSPrioCur = OSPrioHighRdy; 得到需要恢復(fù)的任務(wù)的堆棧

25、指針: 堆棧指針 = OSTCBHighRdy->OSTCBStkPtr; 將所有處理器寄存器從新任務(wù)的堆棧中恢復(fù)出來(lái); 執(zhí)行中斷返回指令; },這些代碼必須寫在匯編語(yǔ)言中,因?yàn)橛脩舨荒苤苯訌腃語(yǔ)言中訪問(wèn)CPU寄存器。,OSTickISR(),μC/OS-Ⅱ要求用戶提供一個(gè)時(shí)鐘資源來(lái)實(shí)現(xiàn)時(shí)間的延時(shí)和期滿功能。時(shí)鐘節(jié)拍應(yīng)該每秒鐘發(fā)生10-100次??梢允褂糜布r(shí)鐘,也可以從交流電中獲得50/60

26、Hz的時(shí)鐘頻率。用戶必須在開始多任務(wù)調(diào)度后(調(diào)用OSStart()后)允許時(shí)鐘節(jié)拍中斷。即用戶應(yīng)該在OSStart()運(yùn)行后,μC/OS-Ⅱ啟動(dòng)運(yùn)行的第一個(gè)任務(wù)中初始化節(jié)拍中斷。,時(shí)鐘節(jié)拍ISR的原型程序,void OSTickISR(void){保存處理器寄存器; 調(diào)用OSIntEnter()或者直接將 OSIntNesting加1;  調(diào)用OSTimeTick();  調(diào)用OSIntE

27、xit(); 恢復(fù)處理器寄存器; 執(zhí)行中斷返回指令; },這些代碼必須寫在匯編語(yǔ)言中,因?yàn)橛脩舨荒苤苯訌腃語(yǔ)言中訪問(wèn)CPU寄存器。,OS_CPU_C.C文件,μC/OS-Ⅱ的移植實(shí)例要求用戶編寫六個(gè)簡(jiǎn)單的C函數(shù):OSTaskStkInit()、OSTaskCreateHook()、OSTaskDelHook()、OSTaskSwHook()、OSTaskStatHook()、OSTimeTickHook()唯一必要

28、的函數(shù)是OSTaskStkInit(),其它五個(gè)函數(shù)必須得聲明但沒(méi)必要包含代碼。,OSTaskStkInit(),OSTaskCreate()和OSTaskCreateExt()通過(guò)調(diào)用OSTaskStkInit()來(lái)初始化任務(wù)的堆棧結(jié)構(gòu),因此,堆??雌饋?lái)就像剛發(fā)生過(guò)中斷并將所有的寄存器保存到堆棧中的情形一樣。,假定pdata會(huì)被編譯器保存到堆棧中,OSTaskStkInit()就會(huì)簡(jiǎn)單的模仿編譯器的這種動(dòng)作,將pdata保存到堆棧中(

29、1)。處理器至少得將程序計(jì)數(shù)器的值(中斷返回地址)和處理器的狀態(tài)字存入堆棧(2)。接著,用戶需要將剩下的處理器寄存器保存到堆棧中(3)。一旦用戶初始化了堆棧,OSTaskStkInit()就需要返回堆棧指針?biāo)傅牡刂?4)。,OSTaskCreateHook(),當(dāng)用OSTaskCreate()或OSTaskCreateExt()建立任務(wù)的時(shí)候就會(huì)調(diào)用OSTaskCreateHook(),該函數(shù)允許用戶或使用用戶的移植實(shí)例的用戶擴(kuò)

30、展μC/OS-Ⅱ的功能。當(dāng)μC/OS-Ⅱ設(shè)置完了自己的內(nèi)部結(jié)構(gòu)后,會(huì)在調(diào)用任務(wù)調(diào)度程序之前調(diào)用OSTaskCreateHook()。該函數(shù)被調(diào)用的時(shí)候中斷是禁止的,因此用戶應(yīng)盡量減少該函數(shù)中的代碼以縮短中斷的響應(yīng)時(shí)間。,OSTaskDelHook(),當(dāng)任務(wù)被刪除的時(shí)候就會(huì)調(diào)用OSTaskDelHook()。該函數(shù)在把任務(wù)從μC/OS-Ⅱ的內(nèi)部任務(wù)鏈表中解開之前被調(diào)用。當(dāng)OSTaskDelHook()被調(diào)用的時(shí)候,它會(huì)收到指向正被刪

31、除任務(wù)的OS_TCB的指針,這樣它就可以訪問(wèn)所有的結(jié)構(gòu)成員了。,OSTaskSwHook(),當(dāng)發(fā)生任務(wù)切換的時(shí)候調(diào)用OSTaskSwHook()。不管任務(wù)切換是通過(guò)OSCtxSw()還是OSIntCtxSw()來(lái)執(zhí)行的都會(huì)調(diào)用該函數(shù)。OSTaskSwHook()可以直接訪問(wèn)OSTCBCur 和OSTCBHighRdy,因?yàn)樗鼈兪侨肿兞?。OSTCBCur指向被切換出去的任務(wù)的OS_TCB,而OSTCBHighRdy指向新任務(wù)的OS_

32、TCB。注意在調(diào)用OSTaskSwHook()期間中斷一直是被禁止的。因?yàn)榇a的多少會(huì)影響到中斷的響應(yīng)時(shí)間,所以用戶應(yīng)盡量使代碼簡(jiǎn)化。,OSTaskStatHook(),OSTaskStatHook()每秒鐘都會(huì)被OSTaskStat()調(diào)用一次。用戶可以用OSTaskStatHook()來(lái)擴(kuò)展統(tǒng)計(jì)功能。例如,用戶可以保持并顯示每個(gè)任務(wù)的執(zhí)行時(shí)間,每個(gè)任務(wù)所用的CPU份額,以及每個(gè)任務(wù)執(zhí)行的頻率等等。,OSTimeTickHook(

33、),OSTaskTimeHook()在每個(gè)時(shí)鐘節(jié)拍都會(huì)被OSTaskTick()調(diào)用。實(shí)際上,OSTaskTimeHook()是在節(jié)拍被μC/OS-Ⅱ真正處理,并通知用戶的移植實(shí)例或應(yīng)用程序之前被調(diào)用的。,OSTaskCreateHook(),void OSTaskCreateHook(OS_TCB *ptcb),,OSTaskDelHook(),void OSTaskDelHook(OS_TCB *ptcb),,OSTaskSwHo

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫(kù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論