ucos中斷和時鐘_第1頁
ucos中斷和時鐘_第2頁
ucos中斷和時鐘_第3頁
ucos中斷和時鐘_第4頁
ucos中斷和時鐘_第5頁
已閱讀5頁,還剩17頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、中斷和時鐘王華斌Wanghuabin-v中斷是計算機系統(tǒng)處理異常事件的重要機制!vuC/OS-II的時鐘是通過硬件定時器產(chǎn)生定時中斷實現(xiàn)的。v任務(wù)在運行過程中,應(yīng)內(nèi)部或外部異常事件的請求中止當前任務(wù),而去處理異常事件所要求的任務(wù)的過程叫做中斷中斷。應(yīng)中斷請求而運行的程序叫做中斷服務(wù)子程序(中斷服務(wù)子程序(ISRISR);中斷服務(wù)子程序的入口地址入口地址叫做中斷向量。中斷向量。1、中斷vC/OS中,中斷服務(wù)子程序要用匯編語言來寫中斷服務(wù)子程序要用匯編語言來寫。然而,如果用戶使用的C語言編譯器支持在線匯編語言的話,用戶可以直接將中斷服務(wù)子程序代碼放在C語言的程序文件中。系統(tǒng)接收到中斷請求后,如果這

2、時CPU處于中斷允許狀態(tài),系統(tǒng)就會中止正在運行的任務(wù),而按照中斷向量的指向轉(zhuǎn)而去運行中斷服務(wù)子程序;而中斷服務(wù)子程序的運行結(jié)束后,系統(tǒng)將會根據(jù)情況返回到被中止的任務(wù)繼續(xù)執(zhí)行,或者轉(zhuǎn)向運行另一個具有更高優(yōu)先級別的就緒任務(wù)。(任務(wù)的調(diào)度)總結(jié)v中斷是一種硬件機制,用于通知CPU有個異常事件發(fā)生了。中斷一旦被識別,CPU保存部分(或全部)現(xiàn)場(Context)即部分或全部寄存器的值,跳轉(zhuǎn)到專門的子程序,稱為中斷服務(wù)子程序(ISR)。中斷服務(wù)子程序做事件處理,處理完成后,程序回到:處理完成后,程序回到:(1)在前后臺系統(tǒng)中,程序回到后臺程序(2)對不可剝奪型內(nèi)核而言,程序回到被中斷了的任務(wù)(3)對可剝

3、奪型內(nèi)核而言,讓進入就緒態(tài)的優(yōu)先級最高的任務(wù)開始運行中斷嵌套vUC/OS-II系統(tǒng)運行中斷嵌套,即:高優(yōu)先級別的中斷源的中斷請求可以中斷可以中斷低優(yōu)先級別的中斷服務(wù)程序的運行。v為了記錄中斷嵌套的層數(shù)為了記錄中斷嵌套的層數(shù),定義了一個全局變量OSIntNesting。(1)進入中斷函數(shù):)進入中斷函數(shù):void OSIntEnter (void) if(OSRunning=TRUE)if(OSIntNesting255) OSIntNesting+; /中斷嵌套層數(shù)計數(shù)器加1調(diào)用情況:調(diào)用情況:此函數(shù)在中斷服務(wù)程序保護斷點數(shù)據(jù)后,運行用戶中斷服務(wù)代碼之前來調(diào)用,所以通常把它叫做進入中斷服務(wù)函數(shù)

4、。(2)退出中斷服務(wù)函數(shù))退出中斷服務(wù)函數(shù)中斷嵌套層數(shù)=0?調(diào)度器未被鎖任務(wù)是被中斷的任務(wù)入口獲得最高優(yōu)先級別就緒任務(wù)的prio獲得任務(wù)TCB的指針執(zhí)行中斷級任務(wù)切換返回中斷服務(wù)程序NoNoNoYesYesYesv說明:這個函數(shù)在中斷嵌套層數(shù)計數(shù)器為0、調(diào)度器未被鎖定、從任務(wù)就緒表中查找到的最高級就緒任務(wù)不是被中斷的任務(wù)的條件下將要進行任務(wù)切換,否則就返回被中斷的服務(wù)子程序v源代碼見下頁vvoid OSIntExit (void)vv OS_ENTER_CRITICAL();v if (-OSIntNesting & OSLockNesting) = = 0) v OSIntExitY

5、 = OSUnMapTblOSRdyGrp;v OSPrioHighRdy = (INT8U)(OSIntExitY OSTCBStkPtr = SP/V2.04以上新增4、清中斷源5、重新開中斷6、執(zhí)行用戶代碼做中斷服務(wù); 7、調(diào)用OSIntExit();8、恢復(fù)所有CPU寄存器;9、執(zhí)行中斷返回指令;中斷級任務(wù)切換函數(shù)中斷級任務(wù)切換函數(shù)vuC/OS-II在運行完中斷服務(wù)程序之后,并不一定返回到被中斷的任務(wù)上去,而是要進行一次任務(wù)調(diào)度來決定是返回被中斷的任務(wù)還是運行一個具有更高優(yōu)先級別的任務(wù),因此系統(tǒng)需要一個中斷級任務(wù)調(diào)度器中斷級任務(wù)調(diào)度器。v由函數(shù)OSIntExit()的源代碼可以知道,通

6、過調(diào)用函數(shù)OSIntCtxSw()來進行中斷級的任務(wù)切換。在中斷服務(wù)程序中調(diào)用的負責任務(wù)切換的函數(shù)OSIntCtxSw()叫做中斷級任務(wù)切換叫做中斷級任務(wù)切換函數(shù)函數(shù)。2、時鐘v時鐘:時鐘:任何操作系統(tǒng)都要提供一個周期性的信號源,以供系統(tǒng)處理與時間相關(guān)的事件,這個周期性的信號源叫做時鐘。v時鐘節(jié)拍:時鐘節(jié)拍:UC/OS-II用硬件定時器產(chǎn)生一個周期為毫秒級的周期性中斷來實現(xiàn)系統(tǒng)時鐘。最小的時鐘就是兩次中斷之間間隔的時間,這個最小時鐘單位叫做時鐘節(jié)拍。vOSTickISR() :硬件定時器以時鐘節(jié)拍為周期定時地產(chǎn)生中斷,該中斷的中斷服務(wù)程序就是它。中斷中斷服務(wù)程序服務(wù)程序通過調(diào)用函數(shù)通過調(diào)用函數(shù)

7、來完成系統(tǒng)在每個時鐘節(jié)拍時需要做的工作來完成系統(tǒng)在每個時鐘節(jié)拍時需要做的工作。(1)時鐘節(jié)拍的中斷服務(wù)程序)時鐘節(jié)拍的中斷服務(wù)程序OSTickISR() 用匯編語言用匯編語言來編寫:來編寫:Void OSTickISR(void)保存保存CPU寄存器;寄存器;調(diào)用調(diào)用OSIntEnter(); /記錄中斷嵌套層數(shù)記錄中斷嵌套層數(shù)if(OSIntNesting = 1) OSTCBCur-OSTCBStkPtr=SP; /在任務(wù)在任務(wù)TCB中保存中保存SP調(diào)用調(diào)用OSTimeTick(); /時鐘節(jié)拍服務(wù)函數(shù)時鐘節(jié)拍服務(wù)函數(shù)清除中斷;清除中斷;開中斷;開中斷;調(diào)用調(diào)用OSIntExit(); /

8、中斷嵌套層數(shù)減中斷嵌套層數(shù)減1恢復(fù)恢復(fù)CPU寄存器;寄存器;中斷返回;中斷返回; (2)OSTimeTick()用用C編寫編寫在時鐘中斷服務(wù)程序中調(diào)用在時鐘中斷服務(wù)程序中調(diào)用OSTimeTick() UC/OS-II在每次響應(yīng)定時中斷時調(diào)用OSTimeTick()做了兩件事情:一一是給計數(shù)器OSTime加1;二二是遍歷任務(wù)控制塊鏈表中的所有任務(wù)控制塊,把各個任務(wù)控制塊中用來存放任務(wù)延時時限的OSTCBDly變量減1,并使該項為0,同時又不使被掛起的任務(wù)進入就緒狀態(tài)。簡單地說,函數(shù)OSTimeTick的任務(wù)就是在每個時鐘節(jié)拍了解每個任務(wù)的延時狀態(tài),使其中已經(jīng)到了延時時限的非掛起任務(wù)進入就緒狀態(tài)。

9、Hook()函數(shù)vOSTimeTick()是系統(tǒng)調(diào)用的函數(shù),為了方便應(yīng)用程序設(shè)計人員能在系統(tǒng)調(diào)用的函數(shù)中插入一些自己的工作,OS提供了時鐘節(jié)拍服務(wù)函數(shù)的鉤子函數(shù)OSTimeTickHook()。v此外,OS還提供了OSStkInitHook()、OSInitHookBegin()、OSInitHookEnd()、OSTaskCreateHook()、OSTaskDelHook()、OSTaskSwHook()、OSTaskStatHook()、OSTCBInitHook()、OSTaskIdleHook()等與OSTimeTickHook()一起共10個鉤子函數(shù),以供用戶在系統(tǒng)調(diào)用函數(shù)中書寫自

10、己的代碼。 3、時間管理v任務(wù)的延時:由于嵌入式系統(tǒng)的任務(wù)是一個無限循環(huán),并且UC/OS-II還是一個搶占式內(nèi)核,所以為了使高優(yōu)先級別的任務(wù)不至于獨占CPU,可以給其他優(yōu)先級別較低的任務(wù)獲得CPU使用權(quán)的機會。UC/OS-II規(guī)定:規(guī)定:除了空閑任務(wù)之外的所有任務(wù)必須在任務(wù)中合適的位置調(diào)用系統(tǒng)提供的函數(shù)OSTimeDly(),使當前任務(wù)的運行暫停一段時間并進行一次任務(wù)調(diào)度,以讓出CPU的使用權(quán)。vOSTimeDly()原型: void OSTimeDly(INT16U ticks)函數(shù)的參數(shù)ticks是以時鐘節(jié)拍數(shù)時鐘節(jié)拍數(shù)為單位的延時時間的。vOSTimeDlyHMSM()時、分、秒為參數(shù)時

11、、分、秒為參數(shù)INT8U OSTimeDlyHMSM (INT8U hours, / 時INT8U minutes, / 分INT8U seconds, / 秒INT16U milli / 毫秒)v調(diào)用了以上這兩個函數(shù)的任務(wù),當規(guī)定的延時時間期滿時,或者有其他任務(wù)通過調(diào)用函數(shù)OSTimeDlyResume()取消了延時時,它會立即進入就緒狀態(tài)。v取消任務(wù)的延時OSTimeDlyResume()延時的任務(wù)可以通過在其他任務(wù)中調(diào)用函數(shù)OSTimeDlyResume()取消延時并進入就緒狀態(tài),如果任務(wù)比正在運行的任務(wù)優(yōu)先級別高,則立即引發(fā)一次任務(wù)調(diào)度。v原型:INT8U OSTimeDlyResume(INT8U prio)v獲取和設(shè)置系統(tǒng)時間獲取和設(shè)置系統(tǒng)時間系統(tǒng)定義了一個INT32U類型的全局變量OSTime來記錄系統(tǒng)發(fā)生的時鐘節(jié)拍數(shù)來記錄系統(tǒng)發(fā)生的時鐘節(jié)拍數(shù)。 OSTime在應(yīng)用程序調(diào)用OSStart()時被初始化為0,以后每發(fā)生一個時鐘節(jié)拍, OSTime的值就被加1。在應(yīng)用程序中調(diào)用函數(shù)調(diào)用函數(shù)OSTimeGet()可獲可獲得得OSTime的值的值。原型:INT32U OSTimeGet( void );函數(shù)的返回值即為O

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論