南航嵌入式實時操作系統(tǒng)課件第7章中斷和時間管理_第1頁
南航嵌入式實時操作系統(tǒng)課件第7章中斷和時間管理_第2頁
南航嵌入式實時操作系統(tǒng)課件第7章中斷和時間管理_第3頁
南航嵌入式實時操作系統(tǒng)課件第7章中斷和時間管理_第4頁
南航嵌入式實時操作系統(tǒng)課件第7章中斷和時間管理_第5頁
已閱讀5頁,還剩86頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第七章

中斷和時間管理

17.1中斷管理

中斷的分類中斷處理的過程實時內(nèi)核的中斷管理用戶中斷服務程序中斷時序*

27.1.1概述

從發(fā)展過程來看:中斷(interrupt)最初被用來替換I/O操作的輪詢處理方式,以提高I/O處理的效率。隨后,中斷又包含了自陷(trap,也稱為內(nèi)部中斷或是軟件中斷)的功能。后來,中斷的概念得到進一步擴大,被定義為導致程序正常執(zhí)行流程發(fā)生改變的事件(不包括程序的分支情況)。可把概念被擴大的中斷稱為廣義中斷。3概述

在實際應用中,廣義的中斷通常被分為中斷、自陷和異常(exception)等類別。中斷是由于CPU外部的原因而改變程序執(zhí)行流程的過程,屬于異步事件,又稱為硬件中斷。自陷和異常則為同步事件;自陷表示通過處理器所擁有的軟件指令、可預期地使處理器正在執(zhí)行的程序的執(zhí)行流程發(fā)生變化,以執(zhí)行特定的程序。自陷是顯式的事件,需要無條件地執(zhí)行;Motorola68000系列中的Trap指令ARM中的SWI指令Intel80x86中的INT指令

4概述

異常為CPU自動產(chǎn)生的自陷,以處理異常事件。如被0除、執(zhí)行非法指令和內(nèi)存保護故障等。異常沒有對應的處理器指令,當異常事件發(fā)生時,處理器也需要無條件地掛起當前運行的程序,執(zhí)行特定的處理程序。

5概述

對實時系統(tǒng),中斷必不可少實時內(nèi)核大都提供了管理中斷的機制方便開發(fā)中斷處理程序,提高中斷處理的可靠性使中斷處理程序與任務有機結合67.1.2中斷的分類

分類方式硬件中斷是否可以被屏蔽:可屏蔽中斷和不可屏蔽中斷中斷源:

硬件中斷和軟件中斷中斷信號的產(chǎn)生:

邊緣觸發(fā)中斷和電平觸發(fā)中斷中斷服務程序的調(diào)用方式:向量中斷、直接中斷和間接中斷7可屏蔽中斷和不可屏蔽中斷

由于中斷的發(fā)生是異步的,程序的正常執(zhí)行流程隨時有可能被中斷服務程序打斷。如果程序正在進行某些重要運算,中斷服務程序的插入將有可能改變某些寄存器的數(shù)據(jù),造成程序的運行發(fā)生錯誤。可屏蔽中斷:能夠被屏蔽掉的中斷。外部設備的中斷請求信號一般需要先通過CPU外部的中斷控制器,再與CPU相應的引腳相連??删幊讨袛嗫刂破骺梢酝ㄟ^軟件進行控制,以禁止或是允許中斷。不可屏蔽中斷:在任何時候都不可屏蔽的。一個比較典型的例子是掉電中斷,當發(fā)生掉電時,無論程序正在進行什么樣的運算,它都肯定無法正常運行下去。這種情況下,急需進行的是一些掉電保護的操作。對這類中斷,應隨時進行響應。

8硬件中斷和軟件中斷

硬件中斷:由于CPU外部的設備所產(chǎn)生的中斷。異步事件:可能在程序執(zhí)行的任何位置發(fā)生,發(fā)生中斷的時間通常是不確定的。軟件中斷:同步中斷或是自陷,通過處理器的軟件指令來實現(xiàn)。產(chǎn)生中斷的時機是預知的,可根據(jù)需要在程序中進行設定。軟件中斷的處理程序以同步的方式進行執(zhí)行。其處理方式同硬件中斷處理程序類似。9硬件中斷和軟件中斷

軟件中斷是一種非常重要的機制:系統(tǒng)可通過該機制在用戶模式執(zhí)行特權模式下的操作。是軟件調(diào)試的一個重要手段,如Intel80x86中的INT3,設置斷點,調(diào)試器可以用它來形成觀察點,并查看隨程序執(zhí)行而動態(tài)變化的事件情況。

10邊緣觸發(fā)中斷和電平觸發(fā)中斷

邊緣觸發(fā)中斷:中斷線從低變到高或是從高變到低時,中斷信號就被發(fā)送出去,并只有在下一次的從低變到高或是從高變到低時才會再度觸發(fā)中斷。

事件發(fā)生的時間非常短,有可能出現(xiàn)中斷控制器丟失中斷的情況。如果多個設備連接到同一個中斷線,即使只有一個設備產(chǎn)生了中斷信號,也必須調(diào)用中斷線對應的所有中斷服務程序來進行匹配,否則會出現(xiàn)中斷的軟件丟失情況。

11邊緣觸發(fā)中斷和電平觸發(fā)中斷

電平觸發(fā)中斷:在硬件中斷線的電平發(fā)生變化時產(chǎn)生中斷信號,并且中斷信號的有效性將持續(xù)保持下去,直到中斷信號被清除。能夠降低中斷信號傳送丟失的情況能通過更有效的方式來服務中斷,每個為該中斷服務后的ISR都要向外圍設備進行確認,然后取消該設備對中斷線的操作。當中斷線的最后一個設備得到中斷服務后,中斷線的電平就會發(fā)生變化,不用對連接到同一個硬件中斷線的所有中斷服務程序進行嘗試。12向量中斷、直接中斷和間接中斷

向量中斷:通過中斷向量來調(diào)用中斷服務程序。直接中斷:中斷對應的中斷服務程序的入口地址是一個固定值,當中斷發(fā)生的時候,程序執(zhí)行流程將直接跳轉到中斷服務程序的入口地址,執(zhí)行中斷服務程序。間接中斷:中斷服務程序的入口地址由寄存器提供。13向量中斷

中斷硬件設備的硬件中斷線(也稱為中斷請求IRQ)被中斷控制器匯集成中斷向量(interruptvector);每個中斷向量對應一個中斷服務程序(interruptserviceroutine,ISR),用來存放中斷服務程序的入口地址或是中斷服務程序的第一條指令。系統(tǒng)中通常包含多個中斷向量,存放這些中斷向量對應中斷服務程序入口地址的內(nèi)存區(qū)域被稱為中斷向量表。

14向量中斷

在Intel80x86處理器中,中斷向量表包含256個入口,每個中斷向量需要四個字節(jié)(存放中斷服務程序的首址)。ARM的中斷向量表開始于內(nèi)存地址0x00000000或是0xFFFF0000處。15中斷控制器

對多個可屏蔽中斷源進行管理,使CPU核心能和更多的中斷資源相聯(lián)系。

能夠?qū)χ袛噙M行排隊:避免中斷信號的丟失對不同的中斷進行優(yōu)先級配置,使高優(yōu)先級中斷能夠中斷低優(yōu)先級中斷,滿足系統(tǒng)中具有更高時間約束特性功能的需要16中斷控制器

在基于x86的架構中,8259是一個非常通用的中斷控制器芯片(稱為PIC,programmableinterruptcontroller)。每個PIC只能夠處理8個中斷,為支持更多數(shù)量的中斷,需要組織成菊花鏈(daisychain)的方式,把一個PIC的輸出連接到另一個PIC的輸入上。

17中斷控制器

在基于x86的架構中,8259是一個非常通用的中斷控制器芯片(稱為PIC,programmableinterruptcontroller)。每個PIC只能夠處理8個中斷,為支持更多數(shù)量的中斷,需要組織成菊花鏈(daisychain)的方式,把一個PIC的輸出連接到另一個PIC的輸入上。

18ARM向量中斷控制器

特性●ARMPrimeCellTM向量中斷控制器;●32個中斷請求輸入;●16個向量IRQ中斷;●16個優(yōu)先級,可動態(tài)分配給中斷請求;●軟件中斷產(chǎn)生。19向量中斷控制器方框圖

20ARM向量中斷控制器

描述向量中斷控制器(VIC)具有32個中斷請求輸入,可將其編程分為3類:FIQ向量IRQ非向量IRQ可編程分配機制意味著不同外設的中斷優(yōu)先級可以動態(tài)分配并調(diào)整。21ARM向量中斷控制器

快速中斷請求(FIQ)要求具有最高優(yōu)先級。如果分配給FIQ的請求多于1個,VIC將中斷請求相“或”后向ARM處理器產(chǎn)生FIQ信號。當只有一個中斷被分配為FIQ時,可實現(xiàn)最短的FIQ等待時間,因為FIQ服務程序只要簡單地啟動器件的處理就可以了。但如果分配給FIQ級的中斷多于1個,F(xiàn)IQ服務程序從VIC中讀出一個字來識別產(chǎn)生中斷請求的FIQ中斷源是哪一個。22ARM向量中斷控制器

向量IRQ具有中等優(yōu)先級。該級別可分配32個請求中的16個。32個請求中的任意一個都可分配到16個向量IRQSlot中的任意一個,其中Slot0具有最高優(yōu)先級,而Slotl5則為最低優(yōu)先級。非向量IRQ的優(yōu)先級最低。VIC將所有向量和非向量IRQ相“或”向ARM處理器產(chǎn)生IRQ信號。IRQ服務程序可通過讀取VIC的一個寄存器立即啟動并跳轉到相應地址。如果有任意一個向量IRQ發(fā)出請求,則VIC提供最高優(yōu)先級請求IRQ服務程序的地址,否則提供默認程序的地址。該默認程序由所有非向量IRQ共用。默認程序可讀取任何VIC寄存器以確定哪個IRQ被激活。237.1.3中斷處理的過程

中斷處理的過程分為:中斷檢測中斷響應中斷處理

24中斷檢測

中斷檢測在每條指令結束時進行,檢測是否有中斷請求或是否滿足異常條件。為滿足中斷處理的需要,在指令周期中使用了中斷周期。在中斷周期中,處理器檢查是否有中斷發(fā)生,即是否出現(xiàn)中斷信號。沒有中斷信號:處理器繼續(xù)運行,并通過取指周期取當前程序的下一條指令;有中斷信號:將進入中斷響應,對中斷進行處理。

25

中斷和指令周期

26中斷響應

中斷響應是由處理器內(nèi)部硬件完成的中斷序列,而不是由程序執(zhí)行的。在Intel80x86中,中斷響應過程的操作如下:對可屏蔽中斷,從8259中斷控制器芯片讀取中斷向量號;將標志寄存器EFLAG、CS和IP壓棧;對于硬件中斷,復位標志寄存器中的IF和TF位,禁止可屏蔽外部中斷和單步異常;根據(jù)中斷向量號,查找中斷向量表,根據(jù)中斷服務程序的首址轉移到中斷服務程序執(zhí)行。27中斷處理

中斷處理:執(zhí)行中斷服務程序。中斷服務程序用來處理自陷、異常或是中斷。盡管導致自陷、異常和中斷的事件不同,但大都具有相同的中斷服務程序結構。28中斷處理

中斷服務程序的主要內(nèi)容:保存上下文:保存中斷服務程序?qū)⒁褂玫乃屑拇嫫鞯膬?nèi)容,以便于在退出中斷服務程序之前進行恢復;如果中斷向量被多個設備所共享,為了確定產(chǎn)生該中斷信號的設備,需要輪詢這些設備的中斷狀態(tài)寄存器;獲取中斷相關的其他信息;對中斷進行具體的處理;恢復保存的上下文;執(zhí)行中斷返回指令,使CPU的控制返回到被中斷的程序繼續(xù)執(zhí)行。29中斷處理

如果對一個中斷的處理還沒有完成,又發(fā)生了另外一個中斷,則稱系統(tǒng)中發(fā)生了多個中斷。非嵌套的中斷處理方式:在處理一個中斷的時候,禁止再發(fā)生中斷。嵌套的中斷處理方式:定義中斷優(yōu)先級,允許高優(yōu)先級的中斷打斷低優(yōu)先級中斷的處理過程。30非嵌套的中斷處理方式

處理中斷的時候,將屏蔽所有其他的中斷請求。新的中斷將被掛起,當處理器再次允許中斷時,再由處理器進行檢查。如果程序執(zhí)行過程中發(fā)生了中斷,在執(zhí)行中斷服務程序的時候?qū)⒔怪袛?;中斷服務程序?zhí)行完成后,恢復正常執(zhí)行流程被中斷的程序之前再使能中斷,并由處理器檢查是否還有中斷。非嵌套中斷處理方式使中斷能夠按發(fā)生順序進行處理。沒有考慮優(yōu)先級,使高優(yōu)先級中斷不能得到及時的處理,甚至導致中斷丟失。31中斷的非嵌套順序處理

32嵌套的中斷處理方式

中斷被劃分為多個優(yōu)先級,中斷服務程序只屏蔽那些比當前中斷優(yōu)先級低或是與當前中斷優(yōu)先級相同的中斷,在完成必要的上下文保存后即使能中斷。高優(yōu)先級中斷請求到達的時候,需要對當前中斷服務程序的狀態(tài)進行保存,然后調(diào)用高優(yōu)先級中斷的服務程序。當高優(yōu)先級中斷的服務程序執(zhí)行完成后,再恢復先前的中斷服務程序繼續(xù)執(zhí)行。33

中斷的嵌套處理

347.1.4實時內(nèi)核的中斷管理

中斷服務程序通常包括三個方面的內(nèi)容:中斷前導:保存中斷現(xiàn)場,進入中斷處理。用戶中斷服務程序:完成對中斷的具體處理。中斷后續(xù):恢復中斷現(xiàn)場,退出中斷處理。35實時內(nèi)核的中斷管理

中斷前導和中斷后續(xù)通常由內(nèi)核的中斷接管程序來實現(xiàn)。

硬件中斷發(fā)生后,中斷接管程序獲得控制權,先由中斷接管程序進行處理,然后才將控制權交給相應的用戶中斷服務程序。用戶中斷服務程序執(zhí)行完成后,又回到中斷接管程序。36實時內(nèi)核的中斷管理

中斷接管程序負責中斷處理的前導和后續(xù)部分的內(nèi)容。中斷處理前導:保存必要的寄存器,并根據(jù)情況在中斷?;蚴侨蝿諚V性O置堆棧的起始位置,然后調(diào)用用戶中斷服務程序。中斷處理后續(xù):實現(xiàn)中斷返回前需要處理的工作,主要包括恢復寄存器和堆棧,并從中斷服務程序返回到被中斷的程序。用戶中斷服務程序被組織為一個表,稱為虛擬中斷向量表。如果需要在用戶中斷服務程序中使用關于浮點運算的操作,中斷前導和中斷后續(xù)中還需要分別對浮點上下文進行保存和恢復。37實時內(nèi)核的中斷管理

如果中斷處理導致系統(tǒng)中出現(xiàn)比被中斷任務具有更高優(yōu)先級的就緒任務出現(xiàn):需要把高優(yōu)先級任務放入就緒隊列;把被中斷的任務從執(zhí)行狀態(tài)轉變?yōu)榫途w狀態(tài);完成用戶中斷服務程序后,在中斷接管程序的中斷后續(xù)處理中激活重調(diào)度程序,使高優(yōu)先級任務能在中斷處理工作完成后得到調(diào)度執(zhí)行。38實時內(nèi)核的中斷管理

在允許中斷嵌套的情況下,在執(zhí)行中斷服務程序的過程中,如果出現(xiàn)高優(yōu)先級的中斷:當前中斷服務程序的執(zhí)行將被打斷,以執(zhí)行高優(yōu)先級中斷的中斷服務程序;當高優(yōu)先級中斷的處理完成后,被打斷的中斷服務程序才又得到繼續(xù)執(zhí)行;發(fā)生中斷嵌套時,如果需要進行任務調(diào)度,任務的調(diào)度將延遲到最外層中斷處理結束時才能發(fā)生。39實時內(nèi)核的中斷管理

中斷服務程序使用被中斷任務的任務??臻g。在允許中斷嵌套處理的情況下,如果中斷嵌套層次過多,中斷服務程序所占用的任務的??臻g可能比較大,將導致任務棧溢出。使用專門的中斷棧來滿足中斷服務程序的需要,降低任務??臻g使用的不確定性。在系統(tǒng)中開辟一個單獨的中斷棧,為所有中斷服務程序所共享。中斷棧必須擁有足夠的空間,即使在最壞中斷嵌套的情況下,中斷棧也不能溢出。如果實時內(nèi)核沒有提供單獨的中斷棧,就需要為任務棧留出足夠的空間,不但要考慮通常的函數(shù)嵌套調(diào)用,還需要滿足中斷嵌套的需要。使用單獨的中斷棧還能有效降低整個系統(tǒng)對棧空間的需求,否則需要為每個任務棧都預留處理中斷的??臻g。

40

C/OS-II的中斷處理

41InterruptsUnderuC/OS-IIYourISR:SaveallCPUregisters; (1)

CallOSIntEnter()or,incrementOSIntNestingdirectly; (2)if(OSIntNesting==1){ (3) OSTCBCur->OSTCBStkPtr=SP; (4)}Clearinterruptingdevice; (5)Re-enableinterrupts(optional) (6)ExecuteusercodetoserviceISR; (7)

CallOSIntExit(); (8)RestoreallCPUregisters; (9)Executeareturnfrominterruptinstruction; (10)voidOSIntEnter(void){OS_ENTER_CRITICAL();OSIntNesting++;OS_EXIT_CRITICAL();}42InterruptsUnderuC/OS-IIvoidOSIntExit(void){OS_ENTER_CRITICAL(); (1)if((--OSIntNesting|OSLockNesting)==0){ (2) OSIntExitY=OSUnMapTbl[OSRdyGrp]; (3) OSPrioHighRdy=(INT8U)((OSIntExitY<<3)+ OSUnMapTbl[OSRdyTbl[OSIntExitY]]);

if(OSPrioHighRdy!=OSPrioCur){

OSTCBHighRdy=OSTCBPrioTbl[OSPrioHighRdy];OSCtxSwCtr++;

OSIntCtxSw(); (4)}}

OS_EXIT_CRITICAL();}43實時內(nèi)核的中斷管理

實時內(nèi)核通常提供如下中斷管理功能:掛接中斷服務程序。把一個函數(shù)(用戶中斷服務程序)同一個虛擬中斷向量表中的中斷向量聯(lián)系在一起。當中斷向量對應中斷發(fā)生的時候,被掛接的用戶中斷服務程序就會被調(diào)用執(zhí)行;獲得中斷服務程序入口地址。根據(jù)中斷向量,獲得掛接在該中斷向量上的中斷服務程序的入口地址;獲取中斷嵌套層次。在允許中斷嵌套的處理中,獲取當前的中斷嵌套層次信息;開中斷;關中斷。447.1.5用戶中斷服務程序

當中斷線上發(fā)生中斷的時候,對應中斷向量中注冊的中斷服務程序就會被調(diào)用執(zhí)行。中斷服務程序的注冊中斷號為索引,把處理中斷的函數(shù)的地址放置到中斷向量的地址表中。中斷服務程序的啟動完全由CPU來負責,不需要操作系統(tǒng)的處理。如果處理器或?qū)崟r內(nèi)核允許中斷嵌套,中斷服務程序?qū)⒖赡鼙涣硗獾闹袛喾粘绦蛩鶕屨?。中斷嵌套將使代碼更加復雜,要求中斷服務程序是可重入的。

45用戶中斷服務程序

由于中斷服務程序中通常都對中斷進行了屏蔽,要求中斷服務程序應該盡可能比較短,保證其他中斷和系統(tǒng)中的任務能夠得到及時處理。中斷服務程序通常都只處理一些必要的操作,其他操作則通過任務的方式來進行。中斷服務程序只是進行與外圍設備相關的數(shù)據(jù)的讀寫操作,并在需要的情況下向外圍設備發(fā)送確認信息,然后喚醒另外的任務進行進一步的處理。用來配合中斷服務程序的另外的任務通常被稱為DSR(deferredserviceroutine)。

46用戶中斷服務程序

/*UsestohandledatafromdataReceiveISR*/dsrTask(){while(1){wait_for_signal_from_isr();process_data_of_ISR();}}/*Usestoreceivedatabyinterrupt*/dataReceiveISR(){…get_data_from_device();send_signal_to_wakeup_dsrTask();

}ISR與DSR相結合的中斷處理方式

47用戶中斷服務程序

在中斷服務程序中可以使用實時內(nèi)核提供的應用編程接口:但一般只能使用不會導致調(diào)用程序可能出現(xiàn)阻塞情況的編程接口,如可以進行掛起任務、喚醒任務、發(fā)送消息等操作;但不要使用分配內(nèi)存、獲得信號量等可能導致中斷服務程序的執(zhí)行流程被阻塞的操作。對中斷的處理不受任務調(diào)度程序的控制,并優(yōu)先于任務的處理。如果中斷出現(xiàn)被阻塞的情況,將導致中斷不能被及時處理,其余工作也就無法按時繼續(xù)進行,將嚴重影響整個系統(tǒng)的確定性。

48用戶中斷服務程序

中斷服務程序不能進行內(nèi)存分配和內(nèi)存釋放:內(nèi)存分配和內(nèi)存釋放過程中通常都要使用信號量,以實現(xiàn)對維護內(nèi)存使用情況的全局數(shù)據(jù)結構的保護。中斷服務程序也不能使用包含了這些操作的編程接口。意味著中斷服務程序不能使用關于對象創(chuàng)建和刪除方面(如任務創(chuàng)建與任務刪除)的操作。49用戶中斷服務程序

中斷服務程序還需要同系統(tǒng)中的任務進行通信。從中斷服務程序到任務的通信機制主要包括以下內(nèi)容:共享內(nèi)存:中斷服務程序同任務共享變量、緩沖區(qū),實現(xiàn)中斷服務程序與任務之間的通信;信號量:中斷服務程序可以釋放任務正在等待的信號量;消息隊列:中斷服務程序可以把消息發(fā)送給正在等待該消息的任務;管道:中斷服務程序可以把消息寫到任務可以進行消息讀取的管道中;異步信號:中斷服務程序可以向任務發(fā)送異步信號,使任務對應的異步信號處理程序能夠得到執(zhí)行。

50μC/OS-Ⅱ中斷服務程序ISRμC/OS-Ⅱ中,中斷服務子程序要用匯編語言來編寫,然而,如果用戶使用的C語言編譯器支持在線匯編語言的話,用戶可以直接將中斷服務子程序代碼放在C語言的程序文件中。51(1)保存全部CPU寄存器的值;(2)調(diào)用OSIntEnter(),或直接把全局變量OSIntNesting(中斷嵌套層次)加1;(3)執(zhí)行用戶代碼做中斷服務;(4)調(diào)用OSIntExit();(5)恢復所有CPU寄存器;(6)執(zhí)行中斷返回指令。用戶ISR的框架52搶占式調(diào)度內(nèi)核的中斷時序圖53中斷延遲時間

中斷延遲時間是指從中斷發(fā)生到系統(tǒng)獲知中斷,并且開始執(zhí)行中斷服務程序所需要的最大滯后時間。中斷延遲時間受到系統(tǒng)關中斷時間的影響:實時系統(tǒng)在進入臨界區(qū)代碼段之前要關中斷,執(zhí)行完臨界代碼之后再開中斷。關中斷的時間越長,中斷延遲就越長,并且可能引起中斷丟失。中斷延遲時間:中斷延遲時間=最大關中斷時間+硬件開始處理中斷到開始執(zhí)行ISR第一條指令之間的時間。

54中斷延遲時間

“硬件開始處理中斷到開始執(zhí)行ISR第一條指令之間的時間”由硬件決定。在確定中斷延遲時間時,要使用最壞情況下的關中斷時間,即最大關中斷時間。“最大關中斷時間”取決于兩方面的因素:

內(nèi)核關中斷時間內(nèi)核在執(zhí)行一些臨界區(qū)的代碼時采取了關中斷;應用關中斷時間

在應用程序中也可以關中斷。關中斷的最長時間應該是這兩種關中斷時間的最大值。55中斷響應時間

中斷響應時間:從中斷發(fā)生到開始執(zhí)行用戶中斷服務程序的第一條指令之間的時間。中斷延遲時間與中斷響應時間的區(qū)別:前者指到中斷服務程序的第一條指令;而后者指到用戶的中斷服務程序的第一條指令。56中斷響應時間

前后臺系統(tǒng)和非搶占式調(diào)度系統(tǒng):保存CPU上下文(主要是其內(nèi)部寄存器的內(nèi)容)以后立即執(zhí)行用戶的中斷服務子程序代碼:中斷響應時間=中斷延遲+保存CPU內(nèi)部寄存器的時間搶占式調(diào)度系統(tǒng):處理中斷時先要做一些處理確保中斷返回前調(diào)度程序能正常工作要先調(diào)用內(nèi)核中斷服務程序入口函數(shù)

通知內(nèi)核即將進行中斷服務,使得內(nèi)核可以跟蹤中斷的嵌套,以便在解除中斷嵌套后進行重調(diào)度中斷響應時間(搶占式調(diào)度)=中斷延遲+保存CPU內(nèi)部寄存器的時間+內(nèi)核中斷服務程序入口函數(shù)的執(zhí)行時間57中斷恢復時間

中斷恢復時間:用戶中斷服務程序結束后回到被中斷代碼之間的時間。前后臺系統(tǒng)和非搶占式調(diào)度系統(tǒng):恢復CPU上下文的時間執(zhí)行中斷返回指令的時間中斷恢復時間=恢復CPU內(nèi)部寄存器的時間+執(zhí)行中斷返回指令的時間

58中斷恢復時間

搶占式調(diào)度系統(tǒng):在用戶的中斷服務子程序的末尾要調(diào)用內(nèi)核中斷服務程序出口函數(shù)。判斷是否脫離了所有的中斷嵌套;如果脫離了嵌套,內(nèi)核要判斷是返回到原來被中斷的任務,還是進入另外一個優(yōu)先級最高的就緒任務。中斷恢復時間(搶占式調(diào)度)=內(nèi)核中斷服務程序出口函數(shù)執(zhí)行時間+恢復即將運行任務的CPU內(nèi)部寄存器的時間+執(zhí)行中斷返回指令的時間59中斷處理時間

用戶的中斷處理是由應用決定的。中斷服務的處理時間應該盡可能地短中斷服務程序:識別中斷來源;從產(chǎn)生中斷的設備取得數(shù)據(jù)或狀態(tài);通知真正處理該事件的那個任務來進行實際的中斷處理工作。607.2時間管理(*)

硬件時鐘設備時間管理61時間管理一般具有以下功能:維持日歷時間;任務有限等待的計時;軟定時器的定時管理;維持系統(tǒng)時間片輪轉調(diào)度。

627.2.1硬件時鐘設備

大多數(shù)嵌入式系統(tǒng)有兩種時鐘源:實時時鐘(realtimeclock,RTC)定時器/計數(shù)器實時時鐘:一般靠電池供電,即使系統(tǒng)斷電,也可以維持日期和時間。實時時鐘獨立于操作系統(tǒng),所以也被稱為硬件時鐘,為整個系統(tǒng)提供一個計時標準。定時器/計數(shù)器:實時內(nèi)核需要一個定時器作為系統(tǒng)時鐘(或稱OS時鐘),并由實時內(nèi)核控制系統(tǒng)時鐘工作。一般情況下,系統(tǒng)時鐘的最小粒度是由應用和操作系統(tǒng)的特點決定的。

63硬件時鐘設備

圖三星44B0X(ARM7)芯片中的RTC在系統(tǒng)沒有上電的情況下,可由后備電池供電;可以通過ARM的STRB/LDRB操作獲取RTC以二進制編碼的十進制數(shù)據(jù)格式向CPU提供8比特數(shù)據(jù)。數(shù)據(jù)包含秒、分、小時、日、月和年等內(nèi)容;使用一個外部的32.768KHz晶振;包括一個閏年產(chǎn)生器;提供告警中斷或是從掉電模式中喚醒的告警功能:;能夠避免2000年問題(即千年蟲問題);獨立的電源引腳;能夠為實時內(nèi)核的系統(tǒng)時鐘提供毫秒級的時間中斷;能夠進行循環(huán)復位。

64硬件時鐘設備

在不同的操作系統(tǒng)中,實時時鐘和系統(tǒng)時鐘之間的關系是不同的。實時時鐘和系統(tǒng)時鐘之間的關系通常也被稱作操作系統(tǒng)的時鐘運作機制。一般來說,實時時鐘是系統(tǒng)時鐘的時間基準,實時內(nèi)核通過讀取實時時鐘來初始化系統(tǒng)時鐘,此后二者保持同步運行,共同維系系統(tǒng)時間。系統(tǒng)時鐘并不是本質(zhì)意義上的時鐘,只有當系統(tǒng)運行起來以后才有效,并且由實時內(nèi)核完全控制。65硬件時鐘設備

從硬件的角度來看,定時器(timer)和計數(shù)器(counter)的概念是可以互換的,其差別主要體現(xiàn)在硬件在特定應用中的使用情況。

66硬件時鐘設備

圖一個簡單的定時器/計數(shù)器包含一個可裝入的8位計數(shù)寄存器,一個時鐘輸入信號和一個輸出脈沖。通過軟件可以把一個位于0x00和0xFF之間的初始數(shù)據(jù)轉入到計數(shù)寄存器。隨后的每一個時鐘輸入信號都會導致該值被增加。當8位計數(shù)器溢出時,就產(chǎn)生輸出脈沖。輸出脈沖可以用來觸發(fā)處理器上的一個中斷,或是在處理器能夠讀取的地方設置一個二進制位。輸出脈沖是操作系統(tǒng)時鐘的硬件基礎,是因為輸出脈沖將送到中斷控制器上,產(chǎn)生中斷信號,觸發(fā)時鐘中斷,由時鐘中斷服務程序維持操作系統(tǒng)時鐘的正常工作。為了重啟定時器,軟件需要重新裝入一個相同或不同的初始數(shù)據(jù)到計數(shù)寄存器。

67硬件時鐘設備

在一個典型的計數(shù)器中,當初始數(shù)據(jù)被裝入后,可以使用一定的方式來啟動計數(shù)器。并且,一個實際的計數(shù)器也需要為處理器提供一種通過數(shù)據(jù)總線讀取計數(shù)寄存器當前值的方式。如果希望定時器能夠自動重新裝入初始數(shù)據(jù),就需要一個鎖存寄存器,以保存處理器所寫入的計數(shù)數(shù)據(jù)。當處理器向鎖存寄存器寫入數(shù)據(jù)時,計數(shù)寄存器也被寫入了該數(shù)據(jù)。定時器溢出時,定時器產(chǎn)生輸出脈沖,然后自動把鎖存寄存器中的數(shù)據(jù)重新裝入到計數(shù)寄存器。由于鎖存寄存器仍然擁有處理器寫入的數(shù)據(jù),計數(shù)器將從同樣的初始數(shù)據(jù)重新開始進行計數(shù)。這樣的定時器能夠產(chǎn)生與時鐘具有相同精度的規(guī)則性輸出。輸出脈沖產(chǎn)生的周期性中斷可以用于實時內(nèi)核需要的tick,或是為UART提供一個波特率時鐘,或是驅(qū)動需要規(guī)則脈沖的設備。

68時間管理

實時內(nèi)核的時間管理以系統(tǒng)時鐘為基礎,系統(tǒng)時鐘一般定義為整數(shù)或長整數(shù),提供給應用程序所有和時間有關的服務。系統(tǒng)時鐘是由定時/計數(shù)器產(chǎn)生的輸出脈沖觸發(fā)中斷而產(chǎn)生的。輸出脈沖的周期叫做一個“時鐘滴答”,也稱為時標、tick。

69時間管理

tick為系統(tǒng)的相對時間單位,也被稱為系統(tǒng)的時基,來源于定時器的周期性中斷,一次中斷表示一個tick。一個tick與具體時間的對應關系可在初始化定時器時設定,也就是說,tick所對應的具體時間長度是可以調(diào)整的。一般來說,實時內(nèi)核都提供相應的調(diào)整機制,應用可以根據(jù)特定情況改變tick對應的時間長度。如,可以使系統(tǒng)5毫秒產(chǎn)生一個tick,也可以是10毫秒產(chǎn)生一個tick。tick的大小決定了整個系統(tǒng)的時間粒度。70時間管理

通常來說,實時內(nèi)核提供以下主要與時間相關的管理:維持相對時間(時間單位為tick)和日歷時間;任務有限等待的計時;定時功能;時間片輪轉調(diào)度的計時。71OSTimeDlyUnderuC/OS-II

voidOSTimeDly(INT16Uticks){/*AllocatestorageforCPUstatusregister*/#ifOS_CRITICAL_METHOD==3OS_CPU_SRcpu_sr;#endifif(ticks>0){/*0meansnodelay!*/OS_ENTER_CRITICAL();if((OSRdyTbl[OSTCBCur->OSTCBY]&=~OSTCBCur->OSTCBBitX)==0){/*Delaycurrenttask*/OSRdyGrp&=~OSTCBCur->OSTCBBitY;}OSTCBCur->OSTCBDly=ticks;/*LoadticksinTCB*/OS_EXIT_CRITICAL();OS_Sched();/*Findnexttasktorun!*/}}72時間管理

管理功能是通過tick處理程序來實現(xiàn)的。定時器發(fā)生中斷后,執(zhí)行系統(tǒng)時鐘中斷處理程序,并在中斷處理程序中調(diào)用tick處理程序,實現(xiàn)系統(tǒng)中與時間和定時相關的操作。tick處理程序作為實時內(nèi)核的一部分,與具體的定時器/計數(shù)器硬件無關,由系統(tǒng)時鐘中斷處理程序調(diào)用,使實時內(nèi)核具有對不同定時器/計數(shù)器硬件的適應性。

73圖tick處理程序

74TickUnderuC/OS-IIvoidOSTickISR(void){Saveprocessorregisters;CallOSIntEnter()orincrementOSIntNesting;if(OSIntNesting==1){OSTCBCur->OSTCBStkPtr=SP;}CallOSTimeTick();Clearinterruptingdevice;Re-enableinterrupts(optional);CallOSIntExit();Restoreprocessorregisters;Executeareturnfrominterruptinstruction;}75voidOSTimeTick(void){#ifOS_CRITICAL_METHOD==3OS_CPU_SRcpu_sr;#endifOS_TCB*ptcb;OSTimeTickHook();(1)#ifOS_TIME_GET_SET_EN>0OS_ENTER_CRITICAL();OSTime++;(2)OS_EXIT_CRITICAL();#endifif(OSRunning==TRUE){ptcb=OSTCBList;(3)while(ptcb->OSTCBPrio!=OS_IDLE_PRIO){(4)OS_ENTER_CRITICAL();if(ptcb->OSTCBDly!=0){if(--ptcb->OSTCBDly==0){if((ptcb->OSTCBStat&OS_STAT_SUSPEND)==0x00){(5)OSRdyGrp|=ptcb->OSTCBBitY;(6)OSRdyTbl[ptcb->OSTCBY]|=ptcb->OSTCBBitX;}else{ptcb->OSTCBDly=1;}}}ptcb=ptcb->OSTCBNext;OS_EXIT_CRITICAL();}}}76TickUnderuC/OS-IIbasedonDSRvoidTickTask(void*pdata){pdata=pdata;for(;;){OSMboxPend(...);/*WaitforsignalfromTickISR*/OSTimeTick();OS_Sched();}}voidOSTickISR(void){Saveprocessorregisters;CallOSIntEnter()orincrementOSIntNesting;if(OSIntNesting==1){OSTCBCur->OSTCBStkPtr=SP;}Posta'dummy'message(e.g.(void*)1)tothetickmailbox;CallOSIntExit();Restoreprocessorregisters;Executeareturnfrominterruptinstruction;}77OSTickISRUnder80x86

OSTickISRPROCFARPUSHA;Saveinterruptedtask'scontextPUSHESPUSHDSMOVAX,SEG_OSIntNesting;ReloadDSMOVDS,AXINCBYTEPTR_OSIntNesting;NotifyuC/OS-IIofISRINT081H;ChainintoDOS'stickISRCALLFARPTR_OSTimeTick;ProcesssystemtickCALLFARPTR_OSIntExit;NotifyuC/OS-IIofendofISRPOPDS;Restoreinterruptedtask'scontextPOPESPOPAIRET;Returntointerruptedtask_OSTickISRENDP78時間管理

相對時間即系統(tǒng)時間,是指相對于系統(tǒng)啟動以來的時間,以tick為單位,每發(fā)生一個tick,對系統(tǒng)的相對時間進行一次加1操作。實時內(nèi)核根據(jù)tick對應的時間長度,可以把相對時間轉換為以秒或是毫秒為單位的其他時間格式,并可根據(jù)實時時鐘獲得日歷時間。如果對任務設置了時間片處理方式,需要在tick處理程序中對當前正在運行的任務的已執(zhí)行時間進行更新,使任務的已執(zhí)行時間數(shù)值加1。執(zhí)行加1操作后,如果任務的已執(zhí)行時間同任務的時間片相等,表示任務使用完一個時間片的執(zhí)行時間,需要結束當前任務的執(zhí)行,設置調(diào)度標志,把當前任務放置到就緒鏈。

79時間管理

時間等待鏈用來存放需要延遲處理的對象:產(chǎn)生tick后,需要對時間等待鏈中的對象的剩余等待時間值進行處理。對于時間等待的對象,通常都被組織為差分鏈表的方式進行管理,以有效降低時間等待對象的管理開銷。在時間差分鏈中,每個表項所包含的計時值并非當前時刻到表項激活時刻的絕對計數(shù),而是該表項和先于它的所有表項的計數(shù)值之和。80時間管理

圖差分鏈在當前時刻,A對象需要等待3個時間單位就應被激活,B對象需要等待5(3+2)個時間單位就應被激活,C對象需要等待10(3+2+5)個時間單位就應被激活,D對象需要等待14(3+2+5+4)個時間單位就應被激活。在當前時刻,如果有一個等待7個時間單位的對象E需要插入到隊列中,由于7-3-2=2,而7-3-2-5=-3,因此E對象需要插入到差分鏈中介于對象B和對象C之間的位置。

81時間管理

對于差分時間鏈,系統(tǒng)每接收到一個tick,就修訂鏈首對象的時間值。如果鏈表對象的時間單位為tick,則每發(fā)生一個tick,鏈首對象的時間值就減1,當減到0時,鏈首對象就被激活,并從差分時間鏈中取下來,下一個對象又成為鏈首對象。

82時間管理

為實現(xiàn)定時功能,實時內(nèi)核需要提供軟件定時器管理功能,應用程序可根據(jù)需要創(chuàng)建、使用軟件定時器。軟件定時器在創(chuàng)建時,由用戶提供定時值,當軟件定時器的定時值減法計數(shù)為0時,觸發(fā)定時器服務例程。用戶可在此例程中完成自己需要的操作。在tick處理程序中需要對軟件定時器的定時值進行減1操作,并在定時值為0時,觸發(fā)掛接在該定時器上的服務例程。

83時間管理

軟件定時器可用于實現(xiàn)“看門狗”(watchdog)。在應用的某個地方進行軟件定時器的停止計時操作,確保定時器在系統(tǒng)正常運行的情況下不會到期,即不會觸發(fā)定時器服務例程;如果某個時候系統(tǒng)進入了定時器服務例程,就表示使用停止計時操作的地方?jīng)]有執(zhí)行到,系統(tǒng)出現(xiàn)了錯誤。如果需要進行任務的重調(diào)度,tick處理程序還需要調(diào)用調(diào)度程序進行任務調(diào)度處理,使需要執(zhí)行的下一個任務獲得對CPU的控制。

84時間管理

在時間方面,內(nèi)核通常提供以下功能:設置系統(tǒng)時間。使應用能夠設置當前系統(tǒng)的日期和時間。獲得系統(tǒng)時間。以日歷時間、系統(tǒng)啟動以來所經(jīng)歷的tick數(shù)等形式獲得當前的系統(tǒng)時間;維護系統(tǒng)時基、處理定時事件。通過時鐘中

溫馨提示

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

最新文檔

評論

0/150

提交評論