第4章 uCOS-II的時鐘和中斷_第1頁
第4章 uCOS-II的時鐘和中斷_第2頁
第4章 uCOS-II的時鐘和中斷_第3頁
第4章 uCOS-II的時鐘和中斷_第4頁
第4章 uCOS-II的時鐘和中斷_第5頁
已閱讀5頁,還剩24頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、1第第 四四 章:章: uC/OS-II的中斷和時鐘的中斷和時鐘目標目標:介紹介紹uc/osII實時操作系統(tǒng)的中斷概念及時間管理,通過實時操作系統(tǒng)的中斷概念及時間管理,通過本章的學習,應該掌握如下知識:本章的學習,應該掌握如下知識:1)uC/OSII的中斷管理和中斷服務程序的的中斷管理和中斷服務程序的 結(jié)構(gòu)結(jié)構(gòu)2)uC/OSII的系統(tǒng)時鐘及實現(xiàn)方法的系統(tǒng)時鐘及實現(xiàn)方法3)時間管理服務:延時、取消延時)時間管理服務:延時、取消延時24.1 uC/OS-II的中斷的中斷 中斷:中斷:任務在運行過程中,應內(nèi)部或外部異步事件的請求任務在運行過程中,應內(nèi)部或外部異步事件的請求中止當前任務,而去處理異步事

2、件所要求的任務的過程叫中止當前任務,而去處理異步事件所要求的任務的過程叫做中斷。做中斷。 中斷服務程序:中斷服務程序:應中斷請求而運行的程序叫中斷服務子程應中斷請求而運行的程序叫中斷服務子程序序(ISR)(ISR)。 中斷向量:中斷向量:中斷服務子程序的入口地址叫中斷向量。中斷服務子程序的入口地址叫中斷向量。 CPUCPU響應中斷的條件:響應中斷的條件:至少有一個中斷源向至少有一個中斷源向CPUCPU發(fā)出中斷信號發(fā)出中斷信號系統(tǒng)允許中斷,且對此中斷信號未予屏蔽系統(tǒng)允許中斷,且對此中斷信號未予屏蔽34.1.1 uC/OS-II的中斷過程的中斷過程uC/OS-II中斷的響應過程:中斷的響應過程:中

3、斷請求中斷請求關(guān)閉中斷關(guān)閉中斷轉(zhuǎn)到中斷向量轉(zhuǎn)到中斷向量保存保存CPU寄存器寄存器通知內(nèi)核進入通知內(nèi)核進入ISR通知內(nèi)核退出通知內(nèi)核退出ISR恢復恢復CPU寄存器寄存器中斷返回中斷返回無新高級任務則無新高級任務則返回原任務返回原任務有新高級任務有新高級任務則運行高級任則運行高級任務務ISR給任務發(fā)信號給任務發(fā)信號通知內(nèi)核退出通知內(nèi)核退出ISR恢復恢復CPU寄存器寄存器中斷返回中斷返回圖圖4-1 中斷的響應過程中斷的響應過程中斷響應中斷響應中斷恢復中斷恢復任務響應時間任務響應時間中斷恢復中斷恢復任務響應時間任務響應時間注意注意: :對于可剝奪型內(nèi)核,中斷服務對于可剝奪型內(nèi)核,中斷服務子程序結(jié)束后,

4、系統(tǒng)進行一次任務子程序結(jié)束后,系統(tǒng)進行一次任務調(diào)度去運行優(yōu)先級最高的就緒任務,調(diào)度去運行優(yōu)先級最高的就緒任務,而不是一定要接續(xù)運行被中斷的任而不是一定要接續(xù)運行被中斷的任務務。(1)進入中斷函數(shù))進入中斷函數(shù)void OSIntEnter (void) if(OSRunning=TRUE)if(OSIntNesting255) OSIntNesting+; /中斷嵌套層數(shù)計數(shù)器加中斷嵌套層數(shù)計數(shù)器加1調(diào)用情況:調(diào)用情況: 此函數(shù)在中斷服務程序保護斷點數(shù)據(jù)后,運行用戶中斷服此函數(shù)在中斷服務程序保護斷點數(shù)據(jù)后,運行用戶中斷服務代碼之前來調(diào)用,所以通常把它叫做進入中斷服務函數(shù)。務代碼之前來調(diào)用,所以

5、通常把它叫做進入中斷服務函數(shù)。函數(shù)作用就是把全局變量函數(shù)作用就是把全局變量OSIntNesting加加1,從而用它來,從而用它來記錄中斷嵌套的層數(shù)記錄中斷嵌套的層數(shù)中斷的進入和離開中斷的進入和離開5圖圖4-2 函數(shù)函數(shù)OSIntExit()的流程圖的流程圖(2)退出中斷服務函數(shù))退出中斷服務函數(shù)中斷嵌套層數(shù)中斷嵌套層數(shù)=0?調(diào)度器未被鎖調(diào)度器未被鎖任務是被中斷的任務任務是被中斷的任務入口入口獲得最高優(yōu)先級別就緒任務的獲得最高優(yōu)先級別就緒任務的prio獲得任務獲得任務TCB的指針的指針執(zhí)行中斷級任務切換執(zhí)行中斷級任務切換返回中斷服務程序返回中斷服務程序NoNoNoYesYesYesvoid OS

6、IntExit (void) OS_ENTER_CRITICAL(); if (-OSIntNesting & OSLockNesting) = = 0) OSIntExitY = OSUnMapTblOSRdyGrp; OSPrioHighRdy = (INT8U)(OSIntExitY OSTCBStkPtr=SPOSTCBCur-OSTCBStkPtr=SPNONO中斷嵌套層中斷嵌套層OSIntNEsting=1OSIntNEsting=1?YESYES清中斷源的中斷申請標志清中斷源的中斷申請標志圖圖4-3 中斷服務子程序中斷服務子程序的流程圖的流程圖CPUCPU寄存器內(nèi)容進棧寄

7、存器內(nèi)容進棧調(diào)用調(diào)用OSIntEnter()OSIntEnter()通知系統(tǒng):進入中斷服務程序通知系統(tǒng):進入中斷服務程序 重新開放中斷重新開放中斷 運行中斷服務代碼運行中斷服務代碼 調(diào)用調(diào)用OSIntExit()OSIntExit()通知系統(tǒng):推出中斷服務程序通知系統(tǒng):推出中斷服務程序 恢復恢復CPUCPU寄存器內(nèi)容寄存器內(nèi)容 執(zhí)行中斷返回指令執(zhí)行中斷返回指令在在uC/OS-IIuC/OS-II中,通常用一個任務來完成異中,通常用一個任務來完成異步事件的處理工作,而在中斷服務程序中步事件的處理工作,而在中斷服務程序中只是向任務發(fā)送消息的方法去激活這個任只是向任務發(fā)送消息的方法去激活這個任務。務

8、。并非為每個任務都定義一個充分大的??詹⒎菫槊總€任務都定義一個充分大的棧空間,中斷嵌套時單獨定義一個中斷嵌套棧,間,中斷嵌套時單獨定義一個中斷嵌套棧,在發(fā)生第在發(fā)生第1次中斷時次中斷時,中斷服務程序?qū)?罩袛喾粘绦驅(qū)?臻g切換到中斷嵌套棧間切換到中斷嵌套棧,這樣這樣,以后發(fā)生的嵌以后發(fā)生的嵌套中斷就一直使用這個棧空間。套中斷就一直使用這個??臻g。84.1.2 中斷級任務切換中斷級任務切換OSIntCtxSw ( )OSTCBCur = OSTCBHighRdy;/ 任務控制塊的切換任務控制塊的切換OSPrioCur = OSPrioHighRdy;SP = OSPrioHighRdy-OST

9、CBStkPtr;/ 使使SP指向待運行任務堆棧指向待運行任務堆棧用出棧指令把用出棧指令把R1、R2彈入彈入CPU的通用寄存器;的通用寄存器;RETI;/ 中斷返回,使中斷返回,使PC指向待運行任務指向待運行任務 與任務級切換函數(shù)與任務級切換函數(shù)OSCtxSW()的原因一樣,中斷級任務切換函數(shù)的原因一樣,中斷級任務切換函數(shù)OSIntCtxSw()通常是用匯編語言來編寫的通常是用匯編語言來編寫的:94.1.3 應用程序中的臨界段應用程序中的臨界段p 在應用程序中經(jīng)常有一些代碼段必須不受任何干擾地連在應用程序中經(jīng)常有一些代碼段必須不受任何干擾地連續(xù)運行,這樣的代碼叫做臨界段。續(xù)運行,這樣的代碼叫做

10、臨界段。p 怎樣保證臨界段的安全?怎樣保證臨界段的安全?p 系統(tǒng)當有異步事件發(fā)生時會引發(fā)中斷請求,系統(tǒng)當有異步事件發(fā)生時會引發(fā)中斷請求,CPUCPU何時響何時響應這個請求?應這個請求?p 需要的條件和策略?需要的條件和策略?p 宏宏OS_ENTER_CRITICAL()和和OS_EXIT_CRITICAL()。臨界段的概念:臨界段的概念:10當處理臨界段代碼時,需要關(guān)中斷,處理完畢后,再開中斷;當處理臨界段代碼時,需要關(guān)中斷,處理完畢后,再開中斷;關(guān)中斷時間是實時內(nèi)核重要的指標之一;關(guān)中斷時間是實時內(nèi)核重要的指標之一;在實際應用中,關(guān)中斷的時間很大程度中取決于微處理器的在實際應用中,關(guān)中斷的時

11、間很大程度中取決于微處理器的結(jié)構(gòu)和編譯器生成的代碼質(zhì)量;結(jié)構(gòu)和編譯器生成的代碼質(zhì)量; C/OSC/OS-II -II定義兩個宏開關(guān)中斷定義兩個宏開關(guān)中斷: :OS_ENTER_CRITICAL()OS_ENTER_CRITICAL(); OS_EXIT_CRITICAL();OS_EXIT_CRITICAL(); 因為這因為這2 2個宏的定義取決于所使用的微處理器,因此在個宏的定義取決于所使用的微處理器,因此在OS_CPU.HOS_CPU.H中可以找到相應的宏定義。中可以找到相應的宏定義。 OS_CPU.HOS_CPU.H是微處理是微處理器相關(guān)的。器相關(guān)的。開關(guān)中斷的宏開關(guān)中斷的宏11 OS_

12、CRITICAL_METHOD=1OS_CRITICAL_METHOD=1用處理器指令關(guān)中斷用處理器指令關(guān)中斷 執(zhí)行執(zhí)行OS_ENTER_CRITICAL( )OS_ENTER_CRITICAL( ),關(guān)中斷,關(guān)中斷 執(zhí)行執(zhí)行OS_EXIT_CRITICAL( ) OS_EXIT_CRITICAL( ) ,開中斷;,開中斷;方法方法1 1的示意性代碼的示意性代碼#define OS_ENTER_CRITICAL()#define OS_ENTER_CRITICAL()asm(“DI”)asm(“DI”)#define OS_EXIT_CRITICAL()#define OS_EXIT_CRIT

13、ICAL()asm(“EI”)asm(“EI”)開關(guān)中斷的實現(xiàn)方法開關(guān)中斷的實現(xiàn)方法1 1 以上代碼所列假定編譯器允許直接在以上代碼所列假定編譯器允許直接在C代碼行之間插入行匯編語句。代碼行之間插入行匯編語句。根據(jù)微處理器和根據(jù)微處理器和CC編譯器的不同,通過在移植文件編譯器的不同,通過在移植文件OS_CPU.HOS_CPU.H中配置中配置OS_CRITICAL_METHODOS_CRITICAL_METHOD來選擇開來選擇開/ /關(guān)中斷的方法:關(guān)中斷的方法:12方法方法2 2的示意性代碼的示意性代碼#define OS_ENTER_CRITICAL()#define OS_ENTER_CRI

14、TICAL()asm(“PUSH PSW”)asm(“PUSH PSW”)asm(“DI”)asm(“DI”)#define OS_EXIT_CRITICAL()#define OS_EXIT_CRITICAL()asm(“POP PSW”)asm(“POP PSW”) 開關(guān)中斷的實現(xiàn)方法開關(guān)中斷的實現(xiàn)方法2 2一些編譯器對插入的行匯編代碼優(yōu)化得并不好,上述辦法未必可行,一些編譯器對插入的行匯編代碼優(yōu)化得并不好,上述辦法未必可行,尤其是堆棧指針相對尋址模式時。尤其是堆棧指針相對尋址模式時。 OS_CRITICAL_METHOD=2OS_CRITICAL_METHOD=2實現(xiàn)實現(xiàn)OS_ENTER

15、_CRITICAL()OS_ENTER_CRITICAL()時,先在堆棧中保存中斷的開時,先在堆棧中保存中斷的開/ /關(guān)狀態(tài),然后再關(guān)中斷;關(guān)狀態(tài),然后再關(guān)中斷;實現(xiàn)實現(xiàn)OS_EXIT_CRITICAL()OS_EXIT_CRITICAL()時,從堆棧中彈出原來中斷的開時,從堆棧中彈出原來中斷的開/ /關(guān)狀態(tài);關(guān)狀態(tài);第第2種方法可使種方法可使CPU中中斷允許標志的狀態(tài)在斷允許標志的狀態(tài)在臨界段前和臨階段后臨界段前和臨階段后不發(fā)生改變。不發(fā)生改變。13void Some_uCOS_II_Service(arguments)void Some_uCOS_II_Service(arguments)

16、 OS_CPU_SROS_CPU_SRcpu_srcpu_srcpu_sr = get_processor_psw();cpu_sr = get_processor_psw();disable_interrupts();disable_interrupts();/ /* * 處理臨界代碼處理臨界代碼* */ /set_processor_psw(cpu_sr);set_processor_psw(cpu_sr); 方法方法3 3的示意性代碼的示意性代碼#define OS_ENTER_CRITICAL()#define OS_ENTER_CRITICAL()cpu_sr = get_proce

17、sser_psw();cpu_sr = get_processer_psw();disable_interrrupts();disable_interrrupts();#define OS_EXIT_CRITICAL()#define OS_EXIT_CRITICAL()set-processer_psw(cpu_sr);set-processer_psw(cpu_sr);開關(guān)中斷的實現(xiàn)方法開關(guān)中斷的實現(xiàn)方法3 3 OS_CRITICAL_METHOD=3OS_CRITICAL_METHOD=3 把當前處理器的狀態(tài)字保存在局部變量中(如把當前處理器的狀態(tài)字保存在局部變量中(如OS_CPU_SR

18、)OS_CPU_SR),關(guān)中,關(guān)中斷時保存,開中斷時恢復。這樣需要在選擇用這種方法進入臨界代碼斷時保存,開中斷時恢復。這樣需要在選擇用這種方法進入臨界代碼的應用程序中定義一個局部變量的應用程序中定義一個局部變量cpu_srcpu_sr。第第3種方法的前提條件:用戶使用種方法的前提條件:用戶使用C編譯器具有擴展功能,用戶可獲得程序狀編譯器具有擴展功能,用戶可獲得程序狀態(tài)字的值,這樣就可以把該值保存在態(tài)字的值,這樣就可以把該值保存在C語言函數(shù)的局部變量中,而不必壓到語言函數(shù)的局部變量中,而不必壓到堆棧里。堆棧里。14任何操作系統(tǒng)都要提供一個周期性的信號源,以供系統(tǒng)處理任何操作系統(tǒng)都要提供一個周期性

19、的信號源,以供系統(tǒng)處理諸如延時、超時等與時間有關(guān)的事件,這個周期性的信號源諸如延時、超時等與時間有關(guān)的事件,這個周期性的信號源叫做時鐘。叫做時鐘。硬件定時器產(chǎn)生一個周期為毫秒級的周期性中斷來實現(xiàn)系統(tǒng)硬件定時器產(chǎn)生一個周期為毫秒級的周期性中斷來實現(xiàn)系統(tǒng)時鐘。最小的時鐘單位就是兩次中斷之間間隔的時間,這個時鐘。最小的時鐘單位就是兩次中斷之間間隔的時間,這個最小時鐘單位叫做時鐘節(jié)拍。最小時鐘單位叫做時鐘節(jié)拍。硬件定時器以時鐘節(jié)拍為周期定時的產(chǎn)生中斷,該中斷的中硬件定時器以時鐘節(jié)拍為周期定時的產(chǎn)生中斷,該中斷的中斷服務程序叫做斷服務程序叫做OSTickISR()OSTickISR(),中斷服務程序通過

20、調(diào)用函數(shù),中斷服務程序通過調(diào)用函數(shù)OSTimeTick()OSTimeTick()來完成系統(tǒng)在每個時鐘節(jié)拍時需要做的工作。來完成系統(tǒng)在每個時鐘節(jié)拍時需要做的工作。4.2 uC/OS-II的時鐘的時鐘 C/OS節(jié)拍率應選在節(jié)拍率應選在10100次次/秒。秒。必須在多任務系統(tǒng)啟動必須在多任務系統(tǒng)啟動OSStart()以后,再開啟時鐘節(jié)拍器。以后,再開啟時鐘節(jié)拍器。15void main (void) OSInit(); / 初始化uC/OS-II /* 創(chuàng)建用戶起始任務(以TaskStart()作為起始任務)*/ OSStart(); / 開始多任務調(diào)度void TaskStart (void *

21、pdata) /* 在這里安裝并啟動uC/OS-II的時鐘節(jié)拍 */ OSStatInit(); / 初始化統(tǒng)計任務 /* 創(chuàng)建用戶應用程序任務 */ for (;) /* 這里是TaskStart()的代碼 */ F 16void OSTickISR(void) 保存保存CPU寄存器;寄存器; 調(diào)用調(diào)用OSIntEnter(); / 記錄中斷嵌套層數(shù)記錄中斷嵌套層數(shù) if(OSIntNesting = 1) OSTCBCur - OSTCBStkPtr = SP; / 在任務在任務TCB中保存堆棧指針中保存堆棧指針 調(diào)用調(diào)用OSTimeTick(); / 節(jié)拍處理節(jié)拍處理 清除中斷清除中斷;

22、 開中斷開中斷; 調(diào)用調(diào)用OSIntExit(); 恢復恢復CPU寄存器寄存器; 執(zhí)行中斷返回指令執(zhí)行中斷返回指令;4.2.1 4.2.1 時鐘節(jié)拍中斷服務子程序時鐘節(jié)拍中斷服務子程序程序清單程序清單 : : 時鐘節(jié)拍中斷服務子程序的示意代碼時鐘節(jié)拍中斷服務子程序的示意代碼17 時鐘節(jié)拍服務函數(shù)時鐘節(jié)拍服務函數(shù)void OSTimeTick (void) OS_TCB *ptcb; OSTimeTickHook(); #if OS_TIME_GET_SET_EN 0 OS_ENTER_CRITICAL(); OSTime+; / 記錄節(jié)拍數(shù)記錄節(jié)拍數(shù) OS_EXIT_CRITICAL(); #

23、endif if (OSRunning = TRUE) ptcb = OSTCBList; while (ptcb-OSTCBPrio != OS_IDLE_PRIO) OS_ENTER_CRITICAL( ); if (ptcb-OSTCBDly != 0) if (-ptcb-OSTCBDly = 0) /任務的延時時間減任務的延時時間減1 if (ptcb-OSTCBStat & OS_STAT_SUSPEND) = OS_STAT_RDY) OSRdyGrp |= ptcb-OSTCBBitY; OSRdyTblptcb-OSTCBY |= ptcb-OSTCBBitX; el

24、se ptcb-OSTCBDly = 1 ptcb = ptcb-OSTCBNext; OS_EXIT_CRITICAL( ); OSTimeTick()做了兩件事情:做了兩件事情:1.給計數(shù)器給計數(shù)器OSTime加加1;2.遍歷任務控制塊鏈表中的所有任務控遍歷任務控制塊鏈表中的所有任務控制塊,把各個任務控制塊中用來存放任制塊,把各個任務控制塊中用來存放任務延時時限的務延時時限的OSTCBDly變量減變量減1,同時,同時又不使被掛起的任務進入就緒態(tài)。又不使被掛起的任務進入就緒態(tài)。簡單地說,函數(shù)簡單地說,函數(shù)OSTimeTick()的任務就的任務就是在每個時鐘節(jié)拍了解每個任務的延時是在每個時鐘節(jié)

25、拍了解每個任務的延時狀態(tài),使其中已經(jīng)到了延時時限的非掛狀態(tài),使其中已經(jīng)到了延時時限的非掛起任務進入就緒狀態(tài)。起任務進入就緒狀態(tài)。18例程例程4-1:在在OS_CPU.COS_CPU.C文件中按如下代碼定義函數(shù)文件中按如下代碼定義函數(shù)OSTimeTickHook()OSTimeTickHook(),然后運行并查看運,然后運行并查看運行結(jié)果。行結(jié)果。INT16U d=0;INT16U d1=0;void OSTimeTickHook (void) char* s0 = “500”; char* s1 = “每每”; char* s2 = “次中斷的調(diào)度次數(shù)次中斷的調(diào)度次數(shù)”; char s8; i

26、f(d = 500) PC_DispStr(14,4,s1,DISP_BGND_BLACK+DISP_FGND_WHITE);PC_DispStr(18,4,s0,DISP_BGND_BLACK+DISP_FGND_WHITE);PC_DispStr(24,4,s2,DISP_BGND_BLACK+DISP_FGND_WHITE);sprintf(s,”%d”,OSCtxSwCtr);PC_DispStr(20,d1+5,s,DISP_BGND_BLACK+DISP_FGND_WHITE);d = 0;d1 += 1; d += 1;OSTimeTick()是系統(tǒng)調(diào)用的函數(shù),為了是系統(tǒng)調(diào)用的函

27、數(shù),為了方便應用程序設計人員能在系統(tǒng)調(diào)用的方便應用程序設計人員能在系統(tǒng)調(diào)用的函數(shù)中插入一些自己的工作。函數(shù)中插入一些自己的工作。19例程例程3-2:設計一個有設計一個有3 3個任務的應用程序。這個任務的應用程序。這3 3個任務分別是:個任務分別是:MyTaskMyTask、YouTaskYouTask、和、和InterTaskInterTask。其中任務。其中任務InterTaskInterTask是在時鐘節(jié)拍中斷服務程序中用鉤子函數(shù)是在時鐘節(jié)拍中斷服務程序中用鉤子函數(shù)OSTimeTickHook()OSTimeTickHook()中斷了中斷了1000010000次時使用一個信號變量次時使用一

28、個信號變量InterKeyInterKey激活的。運行并激活的。運行并分析由中斷服務程序激活任務的工作特點。分析由中斷服務程序激活任務的工作特點。20void main(void) OSInit(); / 初始化初始化uC/OS-II /* 應用程序初始化代碼應用程序初始化代碼 . */ /* . 通過調(diào)用通過調(diào)用OSTaskCreate()創(chuàng)建至少一個任務創(chuàng)建至少一個任務 */ 允許時鐘節(jié)拍(允許時鐘節(jié)拍(TICKER)中斷)中斷; / 千萬不要在這里允許時鐘節(jié)拍中千萬不要在這里允許時鐘節(jié)拍中斷斷! OSStart(); / 開始多任務調(diào)度開始多任務調(diào)度啟動時鐘節(jié)拍不正確的做法啟動時鐘節(jié)拍不

29、正確的做法這里潛在的危險是,時鐘節(jié)拍中斷有可能在這里潛在的危險是,時鐘節(jié)拍中斷有可能在C/OS-啟動第一個任務之前發(fā)生,此時啟動第一個任務之前發(fā)生,此時C/OS-是處在一種不確定的狀態(tài)之中,用是處在一種不確定的狀態(tài)之中,用戶應用程序有可能會崩潰。戶應用程序有可能會崩潰。21 與時間管理有關(guān)的函數(shù)除了時鐘中斷服務子程序和時鐘節(jié)拍函數(shù)外還有與時間管理有關(guān)的函數(shù)除了時鐘中斷服務子程序和時鐘節(jié)拍函數(shù)外還有5 5個個: :OSTimeDLY()OSTimeDLY()OSTimeDLYHMSM()OSTimeDLYHMSM()OSTimeDlyResmue() / OSTimeDlyResmue() /

30、由其他任務喚醒延遲未滿的任務由其他任務喚醒延遲未滿的任務OStimeGet() OStimeGet() / / 獲得獲得OSTime OSTime 的當前值的當前值OSTimeSet()OSTimeSet() / / 設置設置OSTime OSTime 的當前值的當前值必須通過設置必須通過設置OS_CFG.HOS_CFG.H中的一些配置常量,才能使它們使用。中的一些配置常量,才能使它們使用。時間管理函數(shù)時間管理函數(shù)在在OS_CFG.HOS_CFG.H中置中置1 1允許相應函數(shù)允許相應函數(shù)OSTimeDLY()OSTimeDLYHMSM()OS_TIME_DLY_HMSN_ENOSTimeDly

31、Resmue()OS_TIME_DLY_RESUME_ENOStimeGet()OS_TIME_GET_SET_ENOSTimeSet()OS_TIME_GET_SET_EN4.3 4.3 時間管理時間管理22 4.3.1 4.3.1 任務的延時任務的延時p 由于嵌入式系統(tǒng)的任務是一個無限循環(huán)由于嵌入式系統(tǒng)的任務是一個無限循環(huán) , 且且uC/OS-IIuC/OS-II是一個搶占式內(nèi)核。是一個搶占式內(nèi)核。p 使高優(yōu)先級的任務不至于獨占使高優(yōu)先級的任務不至于獨占CPUCPU,uC/OS-IIuC/OS-II規(guī)定:規(guī)定:除了空閑任務之外的所除了空閑任務之外的所有任務必須在任務中延遲并進行一次任務調(diào)度

32、,以讓出有任務必須在任務中延遲并進行一次任務調(diào)度,以讓出CPUCPU的使用權(quán)。的使用權(quán)。void OSTimeDly (INT16U ticks) if (ticks 0) OS_ENTER_CRITICAL(); if (OSRdyTblOSTCBCur-OSTCBY &= OSTCBCur-OSTCBBitX) = 0) OSRdyGrp &= OSTCBCur-OSTCBBitY; / 取消當前任務取消當前任務的就緒狀態(tài)的就緒狀態(tài) OSTCBCur-OSTCBDly = ticks; / 延時節(jié)拍數(shù)存入任務控制塊延時節(jié)拍數(shù)存入任務控制塊 OS_EXIT_CRITICAL(

33、); OS_Sched(); / 調(diào)用調(diào)度函數(shù)調(diào)用調(diào)度函數(shù) INT8U OSTimeDlyHMSM ( INT8U hours,/ 時時 INT8U minutes,/ 分分 INT8U seconds,/ 秒秒 INT16U milli/ 毫秒毫秒 );參數(shù)參數(shù)ticks是以時鐘節(jié)拍數(shù)為單位的延時時間。是以時鐘節(jié)拍數(shù)為單位的延時時間。23 4.3.2 4.3.2 取消任務的延時取消任務的延時p 延時的任務可通過在其它任務中調(diào)用函數(shù)延時的任務可通過在其它任務中調(diào)用函數(shù)OSTimeDlyResume()OSTimeDlyResume()取消延時而取消延時而進入就緒狀態(tài)。如果任務比正在運行的任務優(yōu)

34、先級高,則立即引發(fā)一次任務調(diào)進入就緒狀態(tài)。如果任務比正在運行的任務優(yōu)先級高,則立即引發(fā)一次任務調(diào)度。度。INT8U OSTimeDlyResume ( INT8U Prio);INT8U OSTimeDlyResume (INT8U prio) if (prio = OS_LOWEST_PRIO) return (OS_PRIO_INVALID); OS_ENTER_CRITICAL(); ptcb = (OS_TCB *)OSTCBPrioTblprio; if (ptcb != (OS_TCB *)0) if (ptcb-OSTCBDly != 0) ptcb-OSTCBDly = 0;

35、if (ptcb-OSTCBStat & OS_STAT_SUSPEND) = OS_STAT_RDY) OSRdyGrp |= ptcb-OSTCBBitY; OSRdyTblptcb-OSTCBY |= ptcb-OSTCBBitX; OS_EXIT_CRITICAL();OS_Sched(); else OS_EXIT_CRITICAL(); return (OS_NO_ERR); else OS_EXIT_CRITICAL(); return (OS_TIME_NOT_DLY); OS_EXIT_CRITICAL(); return (OS_TASK_NOT_EXIST); 參

36、數(shù)參數(shù)prio為被取消延時任務的優(yōu)先級別。為被取消延時任務的優(yōu)先級別。24例程例程3-3:本例應用程序的任務使用了延時函數(shù)本例應用程序的任務使用了延時函數(shù)OSTimeDly()OSTimeDly()進行延時,在任務進行延時,在任務MyTaskMyTask中還中還調(diào)用了函數(shù)調(diào)用了函數(shù)OSTimeDlyResume()OSTimeDlyResume()取消了任務取消了任務YouTaskYouTask的延時。為了觀察任務的延時。為了觀察任務YouTaskYouTask的延時時間的變化,在鉤子函數(shù)的延時時間的變化,在鉤子函數(shù)OSTimeTickHook()OSTimeTickHook()輸出了任務輸出

37、了任務YouTaskYouTask在延時時間到時的時鐘節(jié)拍數(shù)。在延時時間到時的時鐘節(jié)拍數(shù)。25 4.3.3 獲取和設置系統(tǒng)時間獲取和設置系統(tǒng)時間p 系統(tǒng)定義一個系統(tǒng)定義一個INT32UINT32U類型的全局變量類型的全局變量OSTimeOSTime來記錄系統(tǒng)發(fā)生的來記錄系統(tǒng)發(fā)生的時鐘節(jié)拍數(shù)。時鐘節(jié)拍數(shù)。p OSTimeOSTime在調(diào)用在調(diào)用OSStart()OSStart()時被初始化為時被初始化為0 0,以后每發(fā)生,以后每發(fā)生1 1個時鐘節(jié)個時鐘節(jié)拍,拍, OSTime的值就被加的值就被加1。p 在應用程序調(diào)用在應用程序調(diào)用OSTimeGet()OSTimeGet()可獲取可獲取OSTimeOSTime的值。的值。p 如果如果應用程序調(diào)用應用程序調(diào)用OSTimeSet(),則可設置,則可設置OSTime的值。的值。INT32U OSTimeGet (void);void OSTimeSet (INT32U ticks);26例程例程3-4:設計一個應用程序,在任務中調(diào)用函數(shù)設計一個應用程序,在任務中調(diào)用函數(shù)OSTimeGet()OSTimeGet()函數(shù)獲得并顯示系統(tǒng)的時鐘函數(shù)獲得并顯示系統(tǒng)的時鐘節(jié)拍

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論