uCOS中斷處理過(guò)程詳解_第1頁(yè)
uCOS中斷處理過(guò)程詳解_第2頁(yè)
uCOS中斷處理過(guò)程詳解_第3頁(yè)
已閱讀5頁(yè),還剩13頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、再看3處代碼:在uCOS_II.H中有如下定義:OS_EXT OS_TCB *OSTCBPrioTblOS_LOWEST_PRIO + 1;/定義指向任務(wù)控制塊的指針數(shù)組,且每個(gè)優(yōu)先級(jí)在同一時(shí)刻只對(duì)應(yīng)一個(gè)任務(wù)OS_EXTINT8UOSPrioCur;/用于保存目前任務(wù)的優(yōu)先級(jí)器OS_EXTINT32UOSCtxSwCtr;/32位無(wú)符號(hào)全局整型變量,作為任務(wù)切換計(jì)數(shù)針OS_EXTOS_TCB*OSTCBHighRdy;/指向最高優(yōu)先級(jí)任務(wù)任務(wù)控制塊的指if (OSPrioHighRdy != OSPrioCur)/就緒態(tài)任務(wù)中的最高優(yōu)先級(jí)已不是目前任務(wù)的優(yōu)先級(jí),則進(jìn)行中斷級(jí)的任務(wù)/切換OSTC

2、BHighRdy = OSTCBPrioTblOSPrioHighRdy;/將最高優(yōu)先級(jí)任務(wù)控制塊指針指向當(dāng)前優(yōu)先級(jí)最高的任務(wù)的任務(wù)控制塊OSCtxSwCtr+;任務(wù)切換計(jì)數(shù)器加 1OSIntCtxSw();調(diào)用中斷級(jí)任務(wù)切換函數(shù)此段代碼體現(xiàn)出了可剝奪型實(shí)時(shí)操作系統(tǒng)內(nèi)核的特點(diǎn)OSIntetxSw ()在80x86上的移植代碼,此代碼在OS_CPU_A.ASM 中,代碼如下:_OSI ntetxSw PROC FARJCALL FAR PTR _OSTaskSwHook ; 調(diào)用 OSTaskSwHook() 函數(shù),此函數(shù)在;OS_CPU_C.C 中只是個(gè)空函數(shù),留給用戶(hù);在代碼移植時(shí)自定義JM

3、OV AX, SEG _OSTCBCur;由于發(fā)生了段轉(zhuǎn)移,恢復(fù)剛才 (當(dāng)前任務(wù))數(shù)MOV DS, AX;據(jù)段JMOV AX, WORD PTR DS:_OSTCBHighRdy+2 ;AH=_OSTCBHighRdy+3;AL=_OSTCBHighRdy+2MOV DX, WORD PTR DS:_OSTCBHighRdy ;DH=_OSTCBHighRdy+1;DL=_OSTCBHighRdyMOV WORD PTR DS:_OSTCBCur+2, AX;_OSTCBCur+3=AH;_OSTCBCur+2=ALMOV WORD PTR DS:_OSTCBCur, DX;_OSTCBCur

4、+1=DH;_OSTCBCur=DL;OSTCBCur=OSTCBHighRdyMOV AL, BYTE PTR DS:_OSPrioHighRdyMOVBYTE PTR DS:_OSPrioCur, AL;OSPrioCur= OSPrioHighRdyLESBX, DWORD PTR DS:_OSTCBHighRdy ;取址指令MOVSS, ES:BX+2;MOVSP, ES:BX;SS:SP=OSTCBHighRdy-OSTCBStkPtrPOP DS ;DS 出棧POPES ;ES出棧POPA;CPU其余寄存器出棧IRET ;中斷返回_OSI ntCtxSw ENDP以上匯編代碼在移植

5、時(shí)根據(jù)處理器不同要作修改四在ISR中通知任務(wù)做事的理解(以 OSSemPost()為例)在理解OSSemPost(),先要理解事件,如下是事件的數(shù)據(jù)結(jié)構(gòu):typedef struct INT8UOSEve ntType;/事件類(lèi)型,這里是OS_EVENT_TYPE_SEM即信號(hào)量INT8UOSEve ntGrp; /等待任務(wù)所在的組INT16UOSEve ntC nt; /當(dāng)事件是信號(hào)量時(shí),使用此計(jì)數(shù)器void *OSEventPtr; /信號(hào)量時(shí)不使用INT8UOSEve ntTblOS_EVENT_TBL_SIZE;等待任務(wù)列表 OS_EVENT;其中OSEventGrp與OSEventT

6、bl 構(gòu)成等待事件的任務(wù)列表,前面所講的OSRdyGrp與OSRdyTbl具有同樣的功能,劃分也一模一樣.在ISR中調(diào)用函數(shù) OSSemPost(),給任務(wù)發(fā)信息,此函數(shù)在OS_SEM.C中:INT8U OSSemPost (OS_EVENT *peve nt)#if OS_CRITICAL_METHOD = 3OS_CPU_SR cpu_sr;#en dif定義開(kāi)關(guān)中斷類(lèi)型#if OS_ARG_CHK_EN 0 如果啟用了函數(shù)參數(shù)檢查功能則進(jìn)行參數(shù)檢查if (peve nt = (OS_EVENT *)0) return (OS_ERR_PEVENT_NULL);檢查是否有事件發(fā)生,如果沒(méi)有

7、則報(bào)錯(cuò)if (peve nt-OSEve ntType != OS_EVENT_TYPE_SEM) return (OS_ERR_EVENT_TYPE);檢查當(dāng)前事件是不是信號(hào)量,不是則出錯(cuò)#en difOS_ENTER_CRITICAL(); 關(guān)中斷if (peve nt-OSEve ntGrp != 0x00) /如果等待事件發(fā)生的任務(wù)列表不為空,/即有任務(wù)處于等待狀態(tài),則進(jìn)入ifOS_Eve ntTaskRdy(peve nt, (void *)0, OS_STAT_SEM);使對(duì)應(yīng)事件的任務(wù)從等待變?yōu)榫途wOS_EXIT_CRITICAL(); 開(kāi)中斷OS_Sched(); II進(jìn)行任務(wù)

8、調(diào)度return (O S_NO_ERR);if (peve nt-OSEve ntC nt OSEve ntCn t+;OS_EXIT_CRITICAL(); return (O S_NO_ERR);OS_EXIT_CRITICAL();return (OS_SEM_OVF);附:uCOS_II大致的啟動(dòng)過(guò)程:main ()OSI ni t();OSTaskCreate();此函數(shù)在OS_TASK.C 中,用于創(chuàng)建任務(wù),調(diào)用了三個(gè)重要的系統(tǒng)函數(shù)它們是 OSTasklnit();OS_TCBInit();OS_Sched();OSStart();OSTaskCreate()此函數(shù)只能在ma i

9、n ()及任務(wù)中調(diào)用,中斷服務(wù)子程序不能調(diào)用OSTaskStkInit();此函數(shù)在OS_CPU_C.C 中,用于創(chuàng)建任務(wù)堆棧,在移植過(guò)程中可根據(jù)/具體情況做修改OS_TCBInit();此函數(shù)在OS_CORE.C 中,用于初始化任務(wù)控制塊,及就緒表OS_Sched()();此函數(shù)在OS_CORE.C 中,是任務(wù)級(jí)調(diào)度函數(shù),作用是獲得最高優(yōu)先級(jí)任務(wù)/并進(jìn)行調(diào)度,此函數(shù)包含一個(gè)重要函數(shù)OS_TASK_SW()OSStart()If(沒(méi)有任務(wù)啟動(dòng))獲取最高優(yōu)先級(jí)任務(wù)OSStartHighRdy();此函數(shù)在OS_CPU_A.ASM 中,用于啟動(dòng)任務(wù),在移植過(guò)程中隨處理器/不同要作修改OS_TASK

10、_SW()在OS_CPU.H中它是一個(gè)宏定義,用于產(chǎn)生任務(wù)切換的中斷,移植中要作修改#defi ne uCOS0x80#defi ne OS_TASK_SW()asm INT uCOS為什么在 OSTaskCreate()中調(diào)用OS_Sched()后還要調(diào)用 OSStart()來(lái)啟用任務(wù)呢?事實(shí)上在從 main()中創(chuàng)建的任務(wù)是不執(zhí)行 OS_Sched()函數(shù)的,因?yàn)榇藭r(shí)的任務(wù)并未啟動(dòng),OSRunning的值為0。任務(wù)啟動(dòng)要通過(guò) OSStart()才行。相反,當(dāng)在一個(gè)已啟動(dòng)的任務(wù)中調(diào)用 OSTaskCreate()就通過(guò) OS_Sched()函數(shù)(OSRunning=1),而不用OSStart

11、(),OSStart()只在操作系統(tǒng)啟動(dòng)時(shí)調(diào)用,任務(wù)中不調(diào)用一.任務(wù)調(diào)度中的幾個(gè)函數(shù)的區(qū)別:uCOSII啟動(dòng)時(shí)的任務(wù)調(diào)度OSStartHighRdy():該函數(shù)在 OS_CPU_A.ASM 中原形如下:_OSStartHighRdy PROC FARMOVAX, SEG _OSTCBHighRdy;MOVDS, AX ;獲得要運(yùn)行任務(wù)的任務(wù)控制塊所在段的段址CALLFAR PTR _OSTaskSwHook ;調(diào)用用戶(hù)自定義的任務(wù)切換接口函數(shù)MOVAL, 1 ;0MOVBYTE PTR DS:_OSRu nning, AL ;置任務(wù)運(yùn)行標(biāo)志LESBX, DWORD PTR DS:_OSTCBH

12、ighRdy ;MOVSS, ES:BX+2;MOVSP, ES:BX+0;從任務(wù)控制塊首指的四個(gè)8位內(nèi)存單元獲得該任務(wù)的任務(wù)堆棧的地址POPDS ;DS出棧至任務(wù)堆棧POPES ;ES出棧至任務(wù)堆棧POPA;將其余CPU寄存器出棧IRET ;恢復(fù)代碼段及指令寄存器內(nèi)容,運(yùn)行任務(wù)_OSStartHighRdy ENDP該函數(shù)由OSStart()調(diào)用void OSStart (void)/ 在 OS_CORE.C 中INT8U y;INT8U x;if (OSR unning = FALSE) y= OSUnM apTblOSRdyGrp;x= OSUnM apTblOSRdyTbly;OSPr

13、ioHighRdy = (INT8U)(y OSTCBStkPtr此時(shí)的任務(wù)堆棧已改變,變?yōu)樽罡邇?yōu)先級(jí)任務(wù)(已是當(dāng)前任務(wù))的任務(wù)堆棧POPDS ;POPES ;POPA ;IRET ;_OSCtxSw ENDP該函數(shù)并非由 OS_Sched()直接調(diào)用而是通過(guò)軟中斷指令I(lǐng)NT 0x80(CPU為80x86),產(chǎn)生中斷,到中斷向量表中找的 OSCtxSw()的入口地址,然后跳轉(zhuǎn)到該函數(shù)并執(zhí)行的。OS_Sched()函數(shù)原形如下:void OS_Sched (void)#if OS_CRITICAL_METHOD = 3OS_CPU_SR cpu_sr;#en difINT8U y;OS_ENTE

14、R_CRITICAL();if (OSI ntNesti ng = 0) & (OSLockNesti ng = 0)/已是中斷前套最外層且無(wú)任務(wù)鎖定則執(zhí)行以下代碼y = OSUnM apTblOSRdyGrp;OSPrioHighRdy = (INT8U)(y 3) + OSUnM apTblOSRdyTbly);/從就緒表中獲得任務(wù)的最高優(yōu)先級(jí)if (OSPrioHighRdy != OSPrioCur)/如果當(dāng)前任務(wù)的優(yōu)先級(jí)已不是最高,則將行任務(wù)切換OSTCBHighRdy = OSTCBPrioTblOSPrioHighRdy;將OSTCBHighRdy 指向具有最高優(yōu)先級(jí)任務(wù)的任務(wù)控

15、制塊OSCtxSwCtr+; / 任務(wù)切換計(jì)數(shù)器加一OS_TASK_SW(); II此函數(shù)是一個(gè)宏,見(jiàn)OS_CPU.H 中的定義:#defi ne uCOS 0x80#defi ne OS_TASK_SW() asm INT uCOS/執(zhí)行中斷,調(diào)用OSCtxSw()OS_EXIT_CRITICAL(); 中斷級(jí)的任務(wù)切換 OSIntCtwSw()已經(jīng)在中斷處理過(guò)程中解釋過(guò),它是通過(guò) OSIntExit()來(lái)調(diào)用的二.關(guān)于操作系統(tǒng)源文件系統(tǒng)結(jié)構(gòu)的認(rèn)識(shí)uCOSII源文件已將各文件作了很好的歸類(lèi),以方便用戶(hù)在其他處理器上以移植它的代碼,其中OS_CPU.H,OS_CPU_A.ASM,OS_CPU_

16、C.C是與用戶(hù)具體使用的處理器相關(guān)的,在移植時(shí)要根據(jù)處理器對(duì)其中的代碼作相應(yīng)修改,這就是所謂的HAL (硬件抽象層)。另外OS_CFG.H,INCLUDES.H與用戶(hù)具體的應(yīng)用程序相關(guān),包括決定任務(wù)的最低優(yōu)先級(jí),用戶(hù)應(yīng)用程序所能擁有的最大任務(wù)數(shù)等。對(duì)于其余文件,用戶(hù)在移植時(shí)一般不用考慮修改。三關(guān)于中斷1中斷嵌套:中斷嵌套只能發(fā)生在中斷服務(wù)子程序中,在中斷服務(wù)子程序運(yùn)行過(guò)程中,當(dāng)有更高優(yōu)先級(jí)的中斷發(fā)生且此時(shí)中斷是打開(kāi)的,則將發(fā)生中斷嵌套2 中斷服務(wù)程序通知任務(wù)做事是通過(guò)事件使任務(wù)處于就緒狀態(tài),而并非立即進(jìn)行任 務(wù)切換,因?yàn)樗鼈兌际钦{(diào)用 OS_Sched(),而函數(shù)只能在所有中斷服務(wù)程序結(jié)束運(yùn)行后才進(jìn)行 切換任務(wù)(因?yàn)?if (OSI ntNest ing = 0) & (OSLockNest ing = 0)OS_TASK_SWQ;),所以任何任務(wù)切換都不能發(fā)生在ISR中,而必須等到所有ISR結(jié)束運(yùn)行后(因?yàn)?if (OSIntNesting = 0) & (OSLockNesting = 0),在OSIntExit()中進(jìn)行.所以任何時(shí)刻uCOSII只能有一個(gè)任務(wù)處于運(yùn)行態(tài).四關(guān)于任務(wù)調(diào)度在任務(wù)中調(diào)用OSTaskCreate (

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論