版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、1第第 四四 章:章: uC/OS-II的中斷和時鐘的中斷和時鐘目標(biāo)目標(biāo):介紹介紹uc/osII實時操作系統(tǒng)的中斷概念及時間管理,通過實時操作系統(tǒng)的中斷概念及時間管理,通過本章的學(xué)習(xí),應(yīng)該掌握如下知識:本章的學(xué)習(xí),應(yīng)該掌握如下知識:1)uC/OSII的中斷管理和中斷服務(wù)程序的的中斷管理和中斷服務(wù)程序的 結(jié)構(gòu)結(jié)構(gòu)2)uC/OSII的系統(tǒng)時鐘及實現(xiàn)方法的系統(tǒng)時鐘及實現(xiàn)方法3)時間管理服務(wù):延時、取消延時)時間管理服務(wù):延時、取消延時24.1 uC/OS-II的中斷的中斷 中斷:中斷:任務(wù)在運行過程中,應(yīng)內(nèi)部或外部異步事件的請求任務(wù)在運行過程中,應(yīng)內(nèi)部或外部異步事件的請求中止當(dāng)前任務(wù),而去處理異步事
2、件所要求的任務(wù)的過程叫中止當(dāng)前任務(wù),而去處理異步事件所要求的任務(wù)的過程叫做中斷。做中斷。 中斷服務(wù)程序:中斷服務(wù)程序:應(yīng)中斷請求而運行的程序叫中斷服務(wù)子程應(yīng)中斷請求而運行的程序叫中斷服務(wù)子程序序(ISR)(ISR)。 中斷向量:中斷向量:中斷服務(wù)子程序的入口地址叫中斷向量。中斷服務(wù)子程序的入口地址叫中斷向量。 CPUCPU響應(yīng)中斷的條件:響應(yīng)中斷的條件:至少有一個中斷源向至少有一個中斷源向CPUCPU發(fā)出中斷信號發(fā)出中斷信號系統(tǒng)允許中斷,且對此中斷信號未予屏蔽系統(tǒng)允許中斷,且對此中斷信號未予屏蔽34.1.1 uC/OS-II的中斷過程的中斷過程uC/OS-II中斷的響應(yīng)過程:中斷的響應(yīng)過程:中
3、斷請求中斷請求關(guān)閉中斷關(guān)閉中斷轉(zhuǎn)到中斷向量轉(zhuǎn)到中斷向量保存保存CPU寄存器寄存器通知內(nèi)核進(jìn)入通知內(nèi)核進(jìn)入ISR通知內(nèi)核退出通知內(nèi)核退出ISR恢復(fù)恢復(fù)CPU寄存器寄存器中斷返回中斷返回?zé)o新高級任務(wù)則無新高級任務(wù)則返回原任務(wù)返回原任務(wù)有新高級任務(wù)有新高級任務(wù)則運行高級任則運行高級任務(wù)務(wù)ISR給任務(wù)發(fā)信號給任務(wù)發(fā)信號通知內(nèi)核退出通知內(nèi)核退出ISR恢復(fù)恢復(fù)CPU寄存器寄存器中斷返回中斷返回圖圖4-1 中斷的響應(yīng)過程中斷的響應(yīng)過程中斷響應(yīng)中斷響應(yīng)中斷恢復(fù)中斷恢復(fù)任務(wù)響應(yīng)時間任務(wù)響應(yīng)時間中斷恢復(fù)中斷恢復(fù)任務(wù)響應(yīng)時間任務(wù)響應(yīng)時間注意注意: :對于可剝奪型內(nèi)核,中斷服務(wù)對于可剝奪型內(nèi)核,中斷服務(wù)子程序結(jié)束后,
4、系統(tǒng)進(jìn)行一次任務(wù)子程序結(jié)束后,系統(tǒng)進(jìn)行一次任務(wù)調(diào)度去運行優(yōu)先級最高的就緒任務(wù),調(diào)度去運行優(yōu)先級最高的就緒任務(wù),而不是一定要接續(xù)運行被中斷的任而不是一定要接續(xù)運行被中斷的任務(wù)務(wù)。(1)進(jìn)入中斷函數(shù))進(jìn)入中斷函數(shù)void OSIntEnter (void) if(OSRunning=TRUE)if(OSIntNesting255) OSIntNesting+; /中斷嵌套層數(shù)計數(shù)器加中斷嵌套層數(shù)計數(shù)器加1調(diào)用情況:調(diào)用情況: 此函數(shù)在中斷服務(wù)程序保護(hù)斷點數(shù)據(jù)后,運行用戶中斷服此函數(shù)在中斷服務(wù)程序保護(hù)斷點數(shù)據(jù)后,運行用戶中斷服務(wù)代碼之前來調(diào)用,所以通常把它叫做進(jìn)入中斷服務(wù)函數(shù)。務(wù)代碼之前來調(diào)用,所以
5、通常把它叫做進(jìn)入中斷服務(wù)函數(shù)。函數(shù)作用就是把全局變量函數(shù)作用就是把全局變量OSIntNesting加加1,從而用它來,從而用它來記錄中斷嵌套的層數(shù)記錄中斷嵌套的層數(shù)中斷的進(jìn)入和離開中斷的進(jìn)入和離開5圖圖4-2 函數(shù)函數(shù)OSIntExit()的流程圖的流程圖(2)退出中斷服務(wù)函數(shù))退出中斷服務(wù)函數(shù)中斷嵌套層數(shù)中斷嵌套層數(shù)=0?調(diào)度器未被鎖調(diào)度器未被鎖任務(wù)是被中斷的任務(wù)任務(wù)是被中斷的任務(wù)入口入口獲得最高優(yōu)先級別就緒任務(wù)的獲得最高優(yōu)先級別就緒任務(wù)的prio獲得任務(wù)獲得任務(wù)TCB的指針的指針執(zhí)行中斷級任務(wù)切換執(zhí)行中斷級任務(wù)切換返回中斷服務(wù)程序返回中斷服務(wù)程序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清中斷源的中斷申請標(biāo)志清中斷源的中斷申請標(biāo)志圖圖4-3 中斷服務(wù)子程序中斷服務(wù)子程序的流程圖的流程圖CPUCPU寄存器內(nèi)容進(jìn)棧寄存器內(nèi)容
7、進(jìn)棧調(diào)用調(diào)用OSIntEnter()OSIntEnter()通知系統(tǒng):進(jìn)入中斷服務(wù)程序通知系統(tǒng):進(jìn)入中斷服務(wù)程序 重新開放中斷重新開放中斷 運行中斷服務(wù)代碼運行中斷服務(wù)代碼 調(diào)用調(diào)用OSIntExit()OSIntExit()通知系統(tǒng):推出中斷服務(wù)程序通知系統(tǒng):推出中斷服務(wù)程序 恢復(fù)恢復(fù)CPUCPU寄存器內(nèi)容寄存器內(nèi)容 執(zhí)行中斷返回指令執(zhí)行中斷返回指令在在uC/OS-IIuC/OS-II中,通常用一個任務(wù)來完成異中,通常用一個任務(wù)來完成異步事件的處理工作,而在中斷服務(wù)程序中步事件的處理工作,而在中斷服務(wù)程序中只是向任務(wù)發(fā)送消息的方法去激活這個任只是向任務(wù)發(fā)送消息的方法去激活這個任務(wù)。務(wù)。并非為
8、每個任務(wù)都定義一個充分大的??詹⒎菫槊總€任務(wù)都定義一個充分大的棧空間,中斷嵌套時單獨定義一個中斷嵌套棧,間,中斷嵌套時單獨定義一個中斷嵌套棧,在發(fā)生第在發(fā)生第1次中斷時次中斷時,中斷服務(wù)程序?qū)?罩袛喾?wù)程序?qū)?臻g切換到中斷嵌套棧間切換到中斷嵌套棧,這樣這樣,以后發(fā)生的嵌以后發(fā)生的嵌套中斷就一直使用這個??臻g。套中斷就一直使用這個??臻g。84.1.2 中斷級任務(wù)切換中斷級任務(wù)切換OSIntCtxSw ( )OSTCBCur = OSTCBHighRdy;/ 任務(wù)控制塊的切換任務(wù)控制塊的切換OSPrioCur = OSPrioHighRdy;SP = OSPrioHighRdy-OSTCBSt
9、kPtr;/ 使使SP指向待運行任務(wù)堆棧指向待運行任務(wù)堆棧用出棧指令把用出棧指令把R1、R2彈入彈入CPU的通用寄存器;的通用寄存器;RETI;/ 中斷返回,使中斷返回,使PC指向待運行任務(wù)指向待運行任務(wù) 與任務(wù)級切換函數(shù)與任務(wù)級切換函數(shù)OSCtxSW()的原因一樣,中斷級任務(wù)切換函數(shù)的原因一樣,中斷級任務(wù)切換函數(shù)OSIntCtxSw()通常是用匯編語言來編寫的通常是用匯編語言來編寫的:94.1.3 應(yīng)用程序中的臨界段應(yīng)用程序中的臨界段p 在應(yīng)用程序中經(jīng)常有一些代碼段必須不受任何干擾地連在應(yīng)用程序中經(jīng)常有一些代碼段必須不受任何干擾地連續(xù)運行,這樣的代碼叫做臨界段。續(xù)運行,這樣的代碼叫做臨界段。
10、p 怎樣保證臨界段的安全?怎樣保證臨界段的安全?p 系統(tǒng)當(dāng)有異步事件發(fā)生時會引發(fā)中斷請求,系統(tǒng)當(dāng)有異步事件發(fā)生時會引發(fā)中斷請求,CPUCPU何時響何時響應(yīng)這個請求?應(yīng)這個請求?p 需要的條件和策略?需要的條件和策略?p 宏宏OS_ENTER_CRITICAL()和和OS_EXIT_CRITICAL()。臨界段的概念:臨界段的概念:10當(dāng)處理臨界段代碼時,需要關(guān)中斷,處理完畢后,再開中斷;當(dāng)處理臨界段代碼時,需要關(guān)中斷,處理完畢后,再開中斷;關(guān)中斷時間是實時內(nèi)核重要的指標(biāo)之一;關(guān)中斷時間是實時內(nèi)核重要的指標(biāo)之一;在實際應(yīng)用中,關(guān)中斷的時間很大程度中取決于微處理器的在實際應(yīng)用中,關(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中可以找到相應(yīng)的宏定義。中可以找到相應(yīng)的宏定義。 OS_CPU.HOS_CPU.H是微處理是微處理器相關(guān)的。器相關(guān)的。開關(guān)中斷的宏開關(guān)中斷的宏11 OS_CRIT
12、ICAL_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_CRITICAL
13、()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_CRITICA
14、L()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_CRI
15、TICAL()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中中斷允許標(biāo)志的狀態(tài)在斷允許標(biāo)志的狀態(tài)在臨界段前和臨階段后臨界段前和臨階段后不發(fā)生改變。不發(fā)生改變。13void Some_uCOS_II_Service(arguments)void Some_uCOS_II_Service(arguments) OS_
16、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_processer
17、_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 把當(dāng)前處理器的狀態(tài)字保存在局部變量中(如把當(dāng)前處理器的狀態(tài)字保存在局部變量中(如OS_CPU_SR)OS_
18、CPU_SR),關(guān)中,關(guān)中斷時保存,開中斷時恢復(fù)。這樣需要在選擇用這種方法進(jìn)入臨界代碼斷時保存,開中斷時恢復(fù)。這樣需要在選擇用這種方法進(jìn)入臨界代碼的應(yīng)用程序中定義一個局部變量的應(yīng)用程序中定義一個局部變量cpu_srcpu_sr。第第3種方法的前提條件:用戶使用種方法的前提條件:用戶使用C編譯器具有擴(kuò)展功能,用戶可獲得程序狀編譯器具有擴(kuò)展功能,用戶可獲得程序狀態(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)生中斷,該中斷的中斷服務(wù)程序叫做斷服務(wù)程序叫做OSTickISR()OSTickISR(),中斷服務(wù)程序通過調(diào)用函數(shù)
20、,中斷服務(wù)程序通過調(diào)用函數(shù)OSTimeTick()OSTimeTick()來完成系統(tǒng)在每個時鐘節(jié)拍時需要做的工作。來完成系統(tǒng)在每個時鐘節(jié)拍時需要做的工作。4.2 uC/OS-II的時鐘的時鐘 C/OS節(jié)拍率應(yīng)選在節(jié)拍率應(yīng)選在10100次次/秒。秒。必須在多任務(wù)系統(tǒng)啟動必須在多任務(wù)系統(tǒng)啟動OSStart()以后,再開啟時鐘節(jié)拍器。以后,再開啟時鐘節(jié)拍器。15void main (void) OSInit(); / 初始化uC/OS-II /* 創(chuàng)建用戶起始任務(wù)(以TaskStart()作為起始任務(wù))*/ OSStart(); / 開始多任務(wù)調(diào)度void TaskStart (void *pdat
21、a) /* 在這里安裝并啟動uC/OS-II的時鐘節(jié)拍 */ OSStatInit(); / 初始化統(tǒng)計任務(wù) /* 創(chuàng)建用戶應(yīng)用程序任務(wù) */ for (;) /* 這里是TaskStart()的代碼 */ F 16void OSTickISR(void) 保存保存CPU寄存器;寄存器; 調(diào)用調(diào)用OSIntEnter(); / 記錄中斷嵌套層數(shù)記錄中斷嵌套層數(shù) if(OSIntNesting = 1) OSTCBCur - OSTCBStkPtr = SP; / 在任務(wù)在任務(wù)TCB中保存堆棧指針中保存堆棧指針 調(diào)用調(diào)用OSTimeTick(); / 節(jié)拍處理節(jié)拍處理 清除中斷清除中斷; 開中斷
22、開中斷; 調(diào)用調(diào)用OSIntExit(); 恢復(fù)恢復(fù)CPU寄存器寄存器; 執(zhí)行中斷返回指令執(zhí)行中斷返回指令;4.2.1 4.2.1 時鐘節(jié)拍中斷服務(wù)子程序時鐘節(jié)拍中斷服務(wù)子程序程序清單程序清單 : : 時鐘節(jié)拍中斷服務(wù)子程序的示意代碼時鐘節(jié)拍中斷服務(wù)子程序的示意代碼17 時鐘節(jié)拍服務(wù)函數(shù)時鐘節(jié)拍服務(wù)函數(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(); #endi
23、f if (OSRunning = TRUE) ptcb = OSTCBList; while (ptcb-OSTCBPrio != OS_IDLE_PRIO) OS_ENTER_CRITICAL( ); if (ptcb-OSTCBDly != 0) if (-ptcb-OSTCBDly = 0) /任務(wù)的延時時間減任務(wù)的延時時間減1 if (ptcb-OSTCBStat & OS_STAT_SUSPEND) = OS_STAT_RDY) OSRdyGrp |= ptcb-OSTCBBitY; OSRdyTblptcb-OSTCBY |= ptcb-OSTCBBitX; else ptcb-
24、OSTCBDly = 1 ptcb = ptcb-OSTCBNext; OS_EXIT_CRITICAL( ); OSTimeTick()做了兩件事情:做了兩件事情:1.給計數(shù)器給計數(shù)器OSTime加加1;2.遍歷任務(wù)控制塊鏈表中的所有任務(wù)控遍歷任務(wù)控制塊鏈表中的所有任務(wù)控制塊,把各個任務(wù)控制塊中用來存放任制塊,把各個任務(wù)控制塊中用來存放任務(wù)延時時限的務(wù)延時時限的OSTCBDly變量減變量減1,同時,同時又不使被掛起的任務(wù)進(jìn)入就緒態(tài)。又不使被掛起的任務(wù)進(jìn)入就緒態(tài)。簡單地說,函數(shù)簡單地說,函數(shù)OSTimeTick()的任務(wù)就的任務(wù)就是在每個時鐘節(jié)拍了解每個任務(wù)的延時是在每個時鐘節(jié)拍了解每個任務(wù)的
25、延時狀態(tài),使其中已經(jīng)到了延時時限的非掛狀態(tài),使其中已經(jīng)到了延時時限的非掛起任務(wù)進(jìn)入就緒狀態(tài)。起任務(wù)進(jìn)入就緒狀態(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; if(d = 50
26、0) 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)用的函數(shù),為了方便應(yīng)用
27、程序設(shè)計人員能在系統(tǒng)調(diào)用的方便應(yīng)用程序設(shè)計人員能在系統(tǒng)調(diào)用的函數(shù)中插入一些自己的工作。函數(shù)中插入一些自己的工作。19例程例程3-2:設(shè)計一個有設(shè)計一個有3 3個任務(wù)的應(yīng)用程序。這個任務(wù)的應(yīng)用程序。這3 3個任務(wù)分別是:個任務(wù)分別是:MyTaskMyTask、YouTaskYouTask、和、和InterTaskInterTask。其中任務(wù)。其中任務(wù)InterTaskInterTask是在時鐘節(jié)拍中斷服務(wù)程序中用鉤子函數(shù)是在時鐘節(jié)拍中斷服務(wù)程序中用鉤子函數(shù)OSTimeTickHook()OSTimeTickHook()中斷了中斷了1000010000次時使用一個信號變量次時使用一個信號變量Int
28、erKeyInterKey激活的。運行并激活的。運行并分析由中斷服務(wù)程序激活任務(wù)的工作特點。分析由中斷服務(wù)程序激活任務(wù)的工作特點。20void main(void) OSInit(); / 初始化初始化uC/OS-II /* 應(yīng)用程序初始化代碼應(yīng)用程序初始化代碼 . */ /* . 通過調(diào)用通過調(diào)用OSTaskCreate()創(chuàng)建至少一個任務(wù)創(chuàng)建至少一個任務(wù) */ 允許時鐘節(jié)拍(允許時鐘節(jié)拍(TICKER)中斷)中斷; / 千萬不要在這里允許時鐘節(jié)拍中千萬不要在這里允許時鐘節(jié)拍中斷斷! OSStart(); / 開始多任務(wù)調(diào)度開始多任務(wù)調(diào)度啟動時鐘節(jié)拍不正確的做法啟動時鐘節(jié)拍不正確的做法這里潛
29、在的危險是,時鐘節(jié)拍中斷有可能在這里潛在的危險是,時鐘節(jié)拍中斷有可能在C/OS-啟動第一個任務(wù)之前發(fā)生,此時啟動第一個任務(wù)之前發(fā)生,此時C/OS-是處在一種不確定的狀態(tài)之中,用是處在一種不確定的狀態(tài)之中,用戶應(yīng)用程序有可能會崩潰。戶應(yīng)用程序有可能會崩潰。21 與時間管理有關(guān)的函數(shù)除了時鐘中斷服務(wù)子程序和時鐘節(jié)拍函數(shù)外還有與時間管理有關(guān)的函數(shù)除了時鐘中斷服務(wù)子程序和時鐘節(jié)拍函數(shù)外還有5 5個個: :OSTimeDLY()OSTimeDLY()OSTimeDLYHMSM()OSTimeDLYHMSM()OSTimeDlyResmue() / OSTimeDlyResmue() / 由其他任務(wù)喚醒延
30、遲未滿的任務(wù)由其他任務(wù)喚醒延遲未滿的任務(wù)OStimeGet() OStimeGet() / / 獲得獲得OSTime OSTime 的當(dāng)前值的當(dāng)前值OSTimeSet()OSTimeSet() / / 設(shè)置設(shè)置OSTime OSTime 的當(dāng)前值的當(dāng)前值必須通過設(shè)置必須通過設(shè)置OS_CFG.HOS_CFG.H中的一些配置常量,才能使它們使用。中的一些配置常量,才能使它們使用。時間管理函數(shù)時間管理函數(shù)在在OS_CFG.HOS_CFG.H中置中置1 1允許相應(yīng)函數(shù)允許相應(yīng)函數(shù)OSTimeDLY()OSTimeDLYHMSM()OS_TIME_DLY_HMSN_ENOSTimeDlyResmue()
31、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 任務(wù)的延時任務(wù)的延時p 由于嵌入式系統(tǒng)的任務(wù)是一個無限循環(huán)由于嵌入式系統(tǒng)的任務(wù)是一個無限循環(huán) , 且且uC/OS-IIuC/OS-II是一個搶占式內(nèi)核。是一個搶占式內(nèi)核。p 使高優(yōu)先級的任務(wù)不至于獨占使高優(yōu)先級的任務(wù)不至于獨占CPUCPU,uC/OS-IIuC/OS-II規(guī)定:規(guī)定:除了空閑任務(wù)之外的所除了空閑任務(wù)之外的所有任務(wù)必須在任務(wù)中延遲并進(jìn)行一次任務(wù)調(diào)度,以讓出有任務(wù)必
32、須在任務(wù)中延遲并進(jìn)行一次任務(wù)調(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; / 取消當(dāng)前任務(wù)取消當(dāng)前任務(wù)的就緒狀態(tài)的就緒狀態(tài) OSTCBCur-OSTCBDly = ticks; / 延時節(jié)拍數(shù)存入任務(wù)控制塊延時節(jié)拍數(shù)存入任務(wù)控制塊 OS_EXIT_CRITICAL(); OS_Sched(); /
33、 調(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 取消任務(wù)的延時取消任務(wù)的延時p 延時的任務(wù)可通過在其它任務(wù)中調(diào)用函數(shù)延時的任務(wù)可通過在其它任務(wù)中調(diào)用函數(shù)OSTimeDlyResume()OSTimeDlyResume()取消延時而取消延時而進(jìn)入就緒狀態(tài)。如果任務(wù)比正在運行的任務(wù)優(yōu)先級高,則立即引發(fā)一次任務(wù)調(diào)進(jìn)入
34、就緒狀態(tài)。如果任務(wù)比正在運行的任務(wù)優(yōu)先級高,則立即引發(fā)一次任務(wù)調(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; if (ptcb-OSTCBSt
35、at & 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); 參數(shù)參數(shù)prio為被取消延時任務(wù)的優(yōu)先級別
36、。為被取消延時任務(wù)的優(yōu)先級別。24例程例程3-3:本例應(yīng)用程序的任務(wù)使用了延時函數(shù)本例應(yīng)用程序的任務(wù)使用了延時函數(shù)OSTimeDly()OSTimeDly()進(jìn)行延時,在任務(wù)進(jìn)行延時,在任務(wù)MyTaskMyTask中還中還調(diào)用了函數(shù)調(diào)用了函數(shù)OSTimeDlyResume()OSTimeDlyResume()取消了任務(wù)取消了任務(wù)YouTaskYouTask的延時。為了觀察任務(wù)的延時。為了觀察任務(wù)YouTaskYouTask的延時時間的變化,在鉤子函數(shù)的延時時間的變化,在鉤子函數(shù)OSTimeTickHook()OSTimeTickHook()輸出了任務(wù)輸出了任務(wù)YouTaskYouTask在延時
37、時間到時的時鐘節(jié)拍數(shù)。在延時時間到時的時鐘節(jié)拍數(shù)。25 4.3.3 獲取和設(shè)置系統(tǒng)時間獲取和設(shè)置系統(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 在應(yīng)用程序調(diào)用在應(yīng)用程序調(diào)用OSTimeGet()OSTimeGet()可獲取可獲取OSTimeOSTime的值。的值。p 如果如果應(yīng)用程序調(diào)用應(yīng)用程序調(diào)用OSTimeSet(),則可設(shè)置,則可設(shè)置OSTime的值。的值。INT32U OSTimeGet (void);void OSTimeSet (INT32U ticks);26例程例程3-4:設(shè)計一個應(yīng)用程序,在任務(wù)中調(diào)用函數(shù)設(shè)計一個應(yīng)用程序,在任務(wù)中調(diào)用函數(shù)OSTimeGet()OSTimeGet()函數(shù)獲得并顯示系統(tǒng)的時鐘函數(shù)獲得并顯示系統(tǒng)的時鐘節(jié)拍數(shù)節(jié)
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 承包合同主體
- 應(yīng)急預(yù)案預(yù)警與預(yù)報
- 藝術(shù)品抵押借款協(xié)議樣本
- 公司股權(quán)轉(zhuǎn)讓居間合同范本
- 釘子銷售合同
- 海參購銷合同范本
- 汽車零部件研發(fā)生產(chǎn)合同
- 成都職業(yè)技術(shù)學(xué)院《數(shù)學(xué)軟件與實驗》2023-2024學(xué)年第二學(xué)期期末試卷
- 智能工廠建設(shè)投資協(xié)議
- 西安交通工程學(xué)院《數(shù)值分析2》2023-2024學(xué)年第二學(xué)期期末試卷
- 慢性腎衰竭的護(hù)理課件
- 2024-2025學(xué)年河南省鄭州市高二上期期末考試數(shù)學(xué)試卷(含答案)
- 2024-2025學(xué)年天津市河?xùn)|區(qū)高一上學(xué)期期末質(zhì)量檢測數(shù)學(xué)試卷(含答案)
- 信永中和筆試題庫及答案
- 甲流乙流培訓(xùn)課件
- 兒科學(xué)川崎病說課
- 2025《省建設(shè)工程檔案移交合同書(責(zé)任書)》
- 2025年云南農(nóng)墾集團(tuán)總部春季社會招聘(9人)管理單位筆試遴選500模擬題附帶答案詳解
- 《石油鉆井基本知識》課件
- 電力兩票培訓(xùn)
- TCCEAS001-2022建設(shè)項目工程總承包計價規(guī)范
評論
0/150
提交評論