第4章uCOSII的時(shí)鐘和中斷_第1頁
第4章uCOSII的時(shí)鐘和中斷_第2頁
第4章uCOSII的時(shí)鐘和中斷_第3頁
第4章uCOSII的時(shí)鐘和中斷_第4頁
第4章uCOSII的時(shí)鐘和中斷_第5頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

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

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

3、斷請(qǐng)求中斷請(qǐng)求關(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新高級(jí)任務(wù)則無新高級(jí)任務(wù)則返回原任務(wù)返回原任務(wù)有新高級(jí)任務(wù)有新高級(jí)任務(wù)則運(yùn)行高級(jí)任則運(yùn)行高級(jí)任務(wù)務(wù)ISR給任務(wù)發(fā)信號(hào)給任務(wù)發(fā)信號(hào)通知內(nèi)核退出通知內(nèi)核退出ISR恢復(fù)恢復(fù)CPU寄存器寄存器中斷返回中斷返回圖圖4-1 中斷的響應(yīng)過程中斷的響應(yīng)過程中斷響應(yīng)中斷響應(yīng)中斷恢復(fù)中斷恢復(fù)任務(wù)響應(yīng)時(shí)間任務(wù)響應(yīng)時(shí)間中斷恢復(fù)中斷恢復(fù)任務(wù)響應(yīng)時(shí)間任務(wù)響應(yīng)時(shí)間注意注意: :對(duì)于可剝奪型內(nèi)核,中斷服務(wù)對(duì)于可剝奪型內(nèi)核,中斷服務(wù)子程序結(jié)束后,

4、系統(tǒng)進(jìn)行一次任務(wù)子程序結(jié)束后,系統(tǒng)進(jìn)行一次任務(wù)調(diào)度去運(yùn)行優(yōu)先級(jí)最高的就緒任務(wù),調(diào)度去運(yùn)行優(yōu)先級(jí)最高的就緒任務(wù),而不是一定要接續(xù)運(yùn)行被中斷的任而不是一定要接續(xù)運(yùn)行被中斷的任務(wù)務(wù)。(1)進(jìn)入中斷函數(shù))進(jìn)入中斷函數(shù)void OSIntEnter (void) if(OSRunning=TRUE)if(OSIntNesting255) OSIntNesting+; /中斷嵌套層數(shù)計(jì)數(shù)器加中斷嵌套層數(shù)計(jì)數(shù)器加1調(diào)用情況:調(diào)用情況: 此函數(shù)在中斷服務(wù)程序保護(hù)斷點(diǎn)數(shù)據(jù)后,運(yùn)行用戶中斷服此函數(shù)在中斷服務(wù)程序保護(hù)斷點(diǎn)數(shù)據(jù)后,運(yùn)行用戶中斷服務(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)先級(jí)別就緒任務(wù)的獲得最高優(yōu)先級(jí)別就緒任務(wù)的prio獲得任務(wù)獲得任務(wù)TCB的指針的指針執(zhí)行中斷級(jí)任務(wù)切換執(zhí)行中斷級(jí)任務(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清中斷源的中斷申請(qǐng)標(biāo)志清中斷源的中斷申請(qǐng)標(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ù)程序 重新開放中斷重新開放中斷 運(yùn)行中斷服務(wù)代碼運(yùn)行中斷服務(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中,通常用一個(gè)任務(wù)來完成異中,通常用一個(gè)任務(wù)來完成異步事件的處理工作,而在中斷服務(wù)程序中步事件的處理工作,而在中斷服務(wù)程序中只是向任務(wù)發(fā)送消息的方法去激活這個(gè)任只是向任務(wù)發(fā)送消息的方法去激活這個(gè)任務(wù)。務(wù)。并非為

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

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

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

11、度中取決于微處理器的結(jié)構(gòu)和編譯器生成的代碼質(zhì)量;結(jié)構(gòu)和編譯器生成的代碼質(zhì)量; C/OSC/OS-II -II定義兩個(gè)宏開關(guān)中斷定義兩個(gè)宏開關(guān)中斷: :OS_ENTER_CRITICAL()OS_ENTER_CRITICAL(); OS_EXIT_CRITICAL();OS_EXIT_CRITICAL(); 因?yàn)檫@因?yàn)檫@2 2個(gè)宏的定義取決于所使用的微處理器,因此在個(gè)宏的定義取決于所使用的微處理器,因此在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)中斷的實(shí)現(xiàn)方法開關(guān)中斷的實(shí)現(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)中斷的實(shí)現(xiàn)方法開關(guān)中斷的實(shí)現(xiàn)方法2 2一些編譯器對(duì)插入的行匯編代碼優(yōu)化得并不好,上述辦法未必可行,一些編譯器對(duì)插入的行匯編代碼優(yōu)化得并不好,上述辦法未必可行,尤其是堆棧指針相對(duì)尋址模式時(shí)。尤其是堆棧指針相對(duì)尋址模式時(shí)。 OS_CRITICAL_METHOD=2OS_CRITICAL_METHOD=2實(shí)現(xiàn)實(shí)現(xiàn)OS_ENTER_CRI

15、TICAL()OS_ENTER_CRITICAL()時(shí),先在堆棧中保存中斷的開時(shí),先在堆棧中保存中斷的開/ /關(guān)狀態(tài),然后再關(guān)中斷;關(guān)狀態(tài),然后再關(guān)中斷;實(shí)現(xiàn)實(shí)現(xiàn)OS_EXIT_CRITICAL()OS_EXIT_CRITICAL()時(shí),從堆棧中彈出原來中斷的開時(shí),從堆棧中彈出原來中斷的開/ /關(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)中斷的實(shí)現(xiàn)方法開關(guān)中斷的實(shí)現(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)中斷時(shí)保存,開中斷時(shí)恢復(fù)。這樣需要在選擇用這種方法進(jìn)入臨界代碼斷時(shí)保存,開中斷時(shí)恢復(fù)。這樣需要在選擇用這種方法進(jìn)入臨界代碼的應(yīng)用程序中定義一個(gè)局部變量的應(yīng)用程序中定義一個(gè)局部變量cpu_srcpu_sr。第第3種方法的前提條件:用戶使用種方法的前提條件:用戶使用C編譯器具有擴(kuò)展功能,用戶可獲得程序狀編譯器具有擴(kuò)展功能,用戶可獲得程序狀態(tài)字的值,這樣就可以把該值保存在態(tài)字的值,這樣就可以把該值保存在C語言函數(shù)的局部變量中,而不必壓到語言函數(shù)的局部變量中,而不必壓到堆棧里。堆棧里。14任何操作系統(tǒng)都要提供一個(gè)周期性的信號(hào)源,以供系統(tǒng)處理任何操作系統(tǒng)都要提供一個(gè)周期性的信號(hào)源

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

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

21、a) /* 在這里安裝并啟動(dòng)uC/OS-II的時(shí)鐘節(jié)拍 */ OSStatInit(); / 初始化統(tǒng)計(jì)任務(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 時(shí)鐘節(jié)拍中斷服務(wù)子程序時(shí)鐘節(jié)拍中斷服務(wù)子程序程序清單程序清單 : : 時(shí)鐘節(jié)拍中斷服務(wù)子程序的示意代碼時(shí)鐘節(jié)拍中斷服務(wù)子程序的示意代碼17 時(shí)鐘節(jié)拍服務(wù)函數(shù)時(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ù)的延時(shí)時(shí)間減任務(wù)的延時(shí)時(shí)間減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.給計(jì)數(shù)器給計(jì)數(shù)器OSTime加加1;2.遍歷任務(wù)控制塊鏈表中的所有任務(wù)控遍歷任務(wù)控制塊鏈表中的所有任務(wù)控制塊,把各個(gè)任務(wù)控制塊中用來存放任制塊,把各個(gè)任務(wù)控制塊中用來存放任務(wù)延時(shí)時(shí)限的務(wù)延時(shí)時(shí)限的OSTCBDly變量減變量減1,同時(shí),同時(shí)又不使被掛起的任務(wù)進(jìn)入就緒態(tài)。又不使被掛起的任務(wù)進(jìn)入就緒態(tài)。簡(jiǎn)單地說,函數(shù)簡(jiǎn)單地說,函數(shù)OSTimeTick()的任務(wù)就的任務(wù)就是在每個(gè)時(shí)鐘節(jié)拍了解每個(gè)任務(wù)的延時(shí)是在每個(gè)時(shí)鐘節(jié)拍了解每個(gè)任務(wù)的

25、延時(shí)狀態(tài),使其中已經(jīng)到了延時(shí)時(shí)限的非掛狀態(tài),使其中已經(jīng)到了延時(shí)時(shí)限的非掛起任務(wù)進(jìn)入就緒狀態(tài)。起任務(wù)進(jìn)入就緒狀態(tài)。18例程例程4-1:在在OS_CPU.COS_CPU.C文件中按如下代碼定義函數(shù)文件中按如下代碼定義函數(shù)OSTimeTickHook()OSTimeTickHook(),然后運(yùn)行并查看運(yùn),然后運(yùn)行并查看運(yùn)行結(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è)計(jì)人員能在系統(tǒng)調(diào)用的方便應(yīng)用程序設(shè)計(jì)人員能在系統(tǒng)調(diào)用的函數(shù)中插入一些自己的工作。函數(shù)中插入一些自己的工作。19例程例程3-2:設(shè)計(jì)一個(gè)有設(shè)計(jì)一個(gè)有3 3個(gè)任務(wù)的應(yīng)用程序。這個(gè)任務(wù)的應(yīng)用程序。這3 3個(gè)任務(wù)分別是:個(gè)任務(wù)分別是:MyTaskMyTask、YouTaskYouTask、和、和InterTaskInterTask。其中任務(wù)。其中任務(wù)InterTaskInterTask是在時(shí)鐘節(jié)拍中斷服務(wù)程序中用鉤子函數(shù)是在時(shí)鐘節(jié)拍中斷服務(wù)程序中用鉤子函數(shù)OSTimeTickHook()OSTimeTickHook()中斷了中斷了1000010000次時(shí)使用一個(gè)信號(hào)變量次時(shí)使用一個(gè)信號(hào)變量Int

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

29、在的危險(xiǎn)是,時(shí)鐘節(jié)拍中斷有可能在這里潛在的危險(xiǎn)是,時(shí)鐘節(jié)拍中斷有可能在C/OS-啟動(dòng)第一個(gè)任務(wù)之前發(fā)生,此時(shí)啟動(dòng)第一個(gè)任務(wù)之前發(fā)生,此時(shí)C/OS-是處在一種不確定的狀態(tài)之中,用是處在一種不確定的狀態(tài)之中,用戶應(yīng)用程序有可能會(huì)崩潰。戶應(yīng)用程序有可能會(huì)崩潰。21 與時(shí)間管理有關(guān)的函數(shù)除了時(shí)鐘中斷服務(wù)子程序和時(shí)鐘節(jié)拍函數(shù)外還有與時(shí)間管理有關(guān)的函數(shù)除了時(shí)鐘中斷服務(wù)子程序和時(shí)鐘節(jié)拍函數(shù)外還有5 5個(gè)個(gè): :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ù)時(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 時(shí)間管理時(shí)間管理22 4.3.1 4.3.1 任務(wù)的延時(shí)任務(wù)的延時(shí)p 由于嵌入式系統(tǒng)的任務(wù)是一個(gè)無限循環(huán)由于嵌入式系統(tǒng)的任務(wù)是一個(gè)無限循環(huán) , 且且uC/OS-IIuC/OS-II是一個(gè)搶占式內(nèi)核。是一個(gè)搶占式內(nèi)核。p 使高優(yōu)先級(jí)的任務(wù)不至于獨(dú)占使高優(yōu)先級(jí)的任務(wù)不至于獨(dú)占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; / 延時(shí)節(jié)拍數(shù)存入任務(wù)控制塊延時(shí)節(jié)拍數(shù)存入任務(wù)控制塊 OS_EXIT_CRITICAL(); OS_Sched(); /

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

34、就緒狀態(tài)。如果任務(wù)比正在運(yùn)行的任務(wù)優(yōu)先級(jí)高,則立即引發(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為被取消延時(shí)任務(wù)的優(yōu)先級(jí)別

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

37、時(shí)間到時(shí)的時(shí)鐘節(jié)拍數(shù)。在延時(shí)時(shí)間到時(shí)的時(shí)鐘節(jié)拍數(shù)。25 4.3.3 獲取和設(shè)置系統(tǒng)時(shí)間獲取和設(shè)置系統(tǒng)時(shí)間p 系統(tǒng)定義一個(gè)系統(tǒng)定義一個(gè)INT32UINT32U類型的全局變量類型的全局變量OSTimeOSTime來記錄系統(tǒng)發(fā)生的來記錄系統(tǒng)發(fā)生的時(shí)鐘節(jié)拍數(shù)。時(shí)鐘節(jié)拍數(shù)。p OSTimeOSTime在調(diào)用在調(diào)用OSStart()OSStart()時(shí)被初始化為時(shí)被初始化為0 0,以后每發(fā)生,以后每發(fā)生1 1個(gè)時(shí)鐘節(jié)個(gè)時(shí)鐘節(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è)計(jì)一個(gè)應(yīng)用程序,在任務(wù)中調(diào)用函數(shù)設(shè)計(jì)一個(gè)應(yīng)用程序,在任務(wù)中調(diào)用函數(shù)OSTimeGet()OSTimeGet()函數(shù)獲得并顯示系統(tǒng)的時(shí)鐘函數(shù)獲得并顯示系統(tǒng)的時(shí)鐘節(jié)拍數(shù)節(jié)

溫馨提示

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