中斷的意義:
中斷的意義,與日常生活的認知並無太大的差距。也就是在做一件事情的同時發生了另一件更緊急的事需要先處理,於是暫停原來處理中的工作,轉而處理新的緊急工作,待處理完這件新的緊急工作後,再處理原工作的整個過程,即所謂的中斷。例如說老師在改做業,學生敲門來問問題,就是一件中斷事件。
中斷相關工作及其順序:
分析中斷的處理過程,可以發覺要處理中斷有許多相關的事情要注意。
首先就是,要被中斷的人是不是正在處理一些不能被中斷的工作,例如說在老師在出題時,是不會也不應被學生中斷,這叫做中斷致能與否(Interrupt enable,disable)。
其次雖然在出題時不方便為學生中斷,但是一同出題的老師,郤可能必須要能中斷,也就是說中斷有不同的中斷源(Interrupt source),而不同的中斷源又能夠有不同的中斷優先順序。(Interrupt priority)
再來就是,當學生來問問題時,老師為了清出桌面讓學生能夠在桌面上推導問題,必需把桌面上原先批改的作業堆在一邊,而在完成問答之後再將作業重新還原。這動作,稱為推入堆疊,拉出堆疊(Push,Pop,Stack)。
上述例子,老師很難分辨敲門的是學生還是老師要中斷,若是老師對每一種中斷設一道門,門口並設有電鈴,而且區分老師與學生有不同的門及電鈴,並可以設定那一個電鈴會響。則不但可以表現出中斷的優先順序以及致能的觀念,同時更可以表現中斷向量表(Interrupt vector)的觀念。
我們可以將不同的門及門鈴對應不同的中斷向量,只有致能的中斷會有中斷通知(門鈴聲),而在得知中斷時(聽到門鈴時),會依不同中斷源(不同門鈴聲),而到不同的中斷向量表讀取中斷服務常式Interrupt service routing(到不同門口開門聽取要求)。如果中斷服務常式太長(有太多事情要談)則跳到較大的記憶體位置(一起找個地方座下來談)。
中斷促成的工作,有時可分為短期動作以及長期動作,例如學生中斷老師是要繳交實驗報告,短期工作是收下學生的報告,長期工作則可以在再方便的時間批改報告。其中短期收下報告的工作會是即刻處理稱為軟即時,而長期批改報告的工作則在成績繳交之前完成即可,這種工作性質是限期完成,亦稱為硬即時工作。
傳統上許多人會把軟硬即時寫成同一個函式,當成中斷服務函式在中斷後執行到完成。但這種樣的做法,在多個中斷同時存在時可能會因為其中一個中斷佔據了執行時間,而阻斷了後續出現的其它中斷即時處理。
例如,有多個同學都要繳報告,如果老師一收到第一個同學的報告後即刻批改,而不再接受後續的同學的中斷,這會擔誤了後續同學繳交報告。如果把收報告與批改報告分為兩段來執行,就可以解決這類中斷衝突問題。
綜合而言,要完成一個中斷工作必須有以下動作:
• 中斷硬體設定:這些動作應在進入中斷程式前完成中斷來源週邊硬體訊號準備:
> 設定中斷來源開啟:現在微控器為省接腳,外部中斷源會與其它輸出入功能共用接腳,要使用它們做為中斷訊號源需設定它們為輸入,允許訊號可以進入微控器內部電路。
> 設定中斷優先權:定義中斷之優先,可避免較不急的事件干擾較急的事件之處理,而同時又允許較急的事件再中斷急的事件。這個設定如不做時,會依硬體出廠時的原始優先順序設定,故有時可以省略。尤其是現代的微控器速度較以前快許多,且中斷中只執行軟即時短工作的觀念愈來愈明確,在中斷中再被中斷的巢狀中斷架構愈來愈沒必要,因此中斷優先權,在新的MCU設計中己經愈來愈多是依據先中斷先處理標準優先順序,不再分中斷來源。
>設定中斷觸發方式:設定中斷源以何種方式通知有事件發生,可以是邊緣觸發或則是準位觸發。
>設定中斷致能:開放中斷源的訊息可以到達MCU請求中斷。
• 中斷服務常(駐函)式的準備:由中斷事件促成愈快愈好的工作必需在中斷事件件發生後即刻(軟即時 Soft Real Time)執行。其執行軟體可由
>使用者自行撰寫:使用者必需小心其執行程式碼僅限軟即時工作,避免額外工作,以免擔誤其它中斷。
>使用C4M-OS提供的軟即時工作方塊:包括,硬體暫存器讀寫,硬體旗標群讀寫,以及純粹計數中斷次數等。這些工作方塊除會執行輸出入及計數之外,也提供了把讀寫資料傳給後續工作,以及促成後續工作接力執行的機制。
• 中斷硬體觸發執行中斷服務常式的安排:在C4M-OS 環境下可以選擇直接使用GCC提供的中斷服務常式Interrupt Service Routing 簡稱ISR來執行軟即時工作。也可以選擇使用C4M-OS 所提供的可登錄式硬體中斷分享機制來執行軟即時工作。
>直接使用GCC 的ISR機制:MCU GCC提供了中斷服務常式ISR,提供中斷服務常式與中斷向量表對應,讓中斷服務常式與中斷源之間產生關聯,中斷發生時才有辨法找到中斷服務常式所在。GCC同時也提供了,在正式開始處理中斷服務常式前,先將原處理工作所佔用暫暫器內容推入暫存於記憶體堆疊中。以及在完成中斷服務常式之後,將原處理工作中佔存器內容由記憶體堆疊中拉回來,回復並繼續先前的工作。
>使用可登錄式硬體中斷分享及致能機制:C4M-OS提供了中斷分享登錄機制,讓複數個軟即時讀寫工作,可以先後分別登錄並分享同一個硬體中斷。這個機制能夠達成多個暫存器讀寫同步執行。在使用C4M-OS的硬體中斷分享機制時,有以下兩個步驟:
▪ 安裝硬體中斷分享器:呼叫硬體中斷分享器的佈局函式,準備好分享中斷的管理結構體以及登錄工作列表。
▪ 登錄軟即時讀寫工作方塊:將C4M-OS現成,或使用者自行撰寫的工作方塊,以呼叫登錄函式的方式,登錄進入硬體中斷分享器中。完成之後,只要這個硬體中斷被觸發時,就會執行所有己登錄其中的所有工作。
• 中斷服務常式的接續工作:中斷事件促成的長期工作(硬即時Hard Real Time工作),必需接續在同一中斷事件觸發的短期工作(軟即時SoftRealTime工作)後進行,且必需限期(於硬極限內)完成。這類長期工作如果放在中斷服務常式中執行,可能會排擠其它中斷服務常式的執行時機,而達不到軟即時的即時性,所以必需要與同一中斷觸發的先導短期工作分割並接續其後執行。若使用C4M-OS時有兩種分割並接續的方式:
>輪詢接續:將硬即時工作放在輪詢迴路中,並先詢問是否有新的先導的軟即時工作被執行過,如果沒有就繞過,如果有就執行硬即時工作。本單元先介紹這一種方法。
>排程接續:C4M-OS作業系統,提供了串接排程執行器,可以由前級的軟即時工作主動將後續的硬即時工作排入排程,並由串接排程執行器主動執行。後續課程有機會會再介紹排程接續方式如何使用。
以下章節,我們依中斷硬體設定,中斷服務常(駐函)式的準備,中斷硬體觸發執行中斷服務常式的安排,以及中斷服務常式的後續工作先後順序說明,在AVR,GUN,以及C4M-OS的支援環境下如何撰寫需用常式及函式以利使用中斷機制實現計算機。