嵌入式系統/中斷
有時系統中會發生一些事情,而處理器卻無法及時處理。實際上,有時系統會發生一些需要立即處理的事情。試想一下,當你坐在電腦前,按下鍵盤上的按鍵,但電腦沒有任何反應?
也許處理器正忙於處理其他任務,並沒有檢查你是否按下了任何按鍵。解決這個問題的方法是使用一種稱為“中斷”的技術。中斷是指引起微處理器停止當前任務,並優先處理一項高優先順序任務的事件。中斷處理完成後,微處理器會返回到之前正在執行的任務。這樣一來,我們就可以確保高優先順序輸入永遠不會被忽略。
中斷分為兩種型別:硬體中斷和軟體中斷。軟體中斷是由軟體使用特定指令觸發的。硬體中斷是由微控制器外部的周邊裝置觸發的。例如,你的嵌入式系統可能包含一個計時器,它每秒向控制器傳送一個脈衝訊號。你的微控制器將等待接收此脈衝,當脈衝到達時,將觸發一箇中斷來處理訊號。
中斷服務程式 (ISR) 是處理中斷請求的程式程式碼部分。當觸發中斷(無論是硬體中斷還是軟體中斷)時,處理器會停止當前任務,將指令指標移動到 ISR,然後繼續執行。當 ISR 完成時,處理器會返回到中斷前的執行位置。
許多嵌入式系統被稱為**中斷驅動系統**,因為大多數處理都在 ISR 中進行,嵌入式系統大部分時間都處於低功耗模式。
有些人將 ISR 分為兩部分:上半部分(快速中斷處理程式,一級中斷處理程式 (FLIH))和下半部分(慢速中斷處理程式,二級中斷處理程式 (SLIH))。上半部分是 ISR 中較快的一部分,它應該快速儲存關於中斷的最小資訊,並在稍後時間安排較慢的下半部分執行。
我們將在 中斷體系結構 中討論雙層中斷處理和其他編寫中斷處理程式的方法。
“中斷向量表”是所有中斷服務程式的列表。它位於程式記憶體中的固定位置。
(一些處理器期望中斷向量表是一系列“呼叫”指令,每個指令後面跟著 ISR 的地址。其他處理器期望中斷向量表只包含 ISR 的地址。)
你必須確保中斷向量表中的每個條目都填充了某個實際 ISR 的地址,即使這意味著讓大多數條目指向“不執行任何操作並從中斷返回”的 ISR。
PIC18 和 PIC16 系列處理器只有一箇中斷處理程式,一個全域性中斷使能位,以及中斷硬體中的一組位。每個可能的中斷源在中斷硬體中都有一對位——一個“標誌”位,當硬體需要處理時被置位,就像它揮舞著旗幟試圖引起注意,以及一個“使能”位,控制處理器是否忽略該標誌,或者停止所有操作並執行中斷處理程式。(令人困惑的是,有些人將這兩個位都稱為“標誌”——在本節中,我們將“請求處理”位稱為標誌位,將“忽略或不忽略”位稱為使能位)。
當 8 位 PICmicro(PIC18 或 PIC16)發生中斷時,硬體會清除全域性中斷使能位,然後開始執行唯一的中斷處理程式。中斷處理程式軟體必須以某種方式檢查所有可能導致中斷的事件——通常是逐個檢查每個中斷標誌——並處理每個事件(如果有必要)。
680x0、x86、dsPIC、PIC24 和許多其他處理器都有多箇中斷向量。當某些硬體請求處理時,硬體會向量到並運行針對該特定硬體部分的特定中斷處理程式。
許多人使用 C 語言編寫中斷程式。使用 gcc 的程式設計師宣告中斷處理程式的方式與宣告普通函式非常類似,如下所示:[1]
void __attribute__ ((interrupt)) universal_handler ();
遺憾的是,沒有標準的方法可以在可移植的 C 語言中編寫中斷處理程式。每個 C 編譯器似乎都使用自己的關鍵字,與任何其他 C 編譯器的關鍵字都不相容。即使使用 gcc,常用的中斷宣告也會因處理器而異。[2][3]
其他程式設計師使用不支援直接在 C 語言中編寫中斷處理程式的 C 編譯器。他們被迫用匯編語言編寫中斷處理程式,手動完成編譯器為前一組人所做的事情。
中斷程式通常以一堆模板程式碼開頭,這些程式碼將狀態暫存器和其他內容壓入堆疊,並以另一堆模板程式碼結尾,用於恢復所有這些內容,以便被中斷的程式碼可以從它停止的地方繼續執行。這些模板程式碼在不同的處理器家族中差別很大——並且與正常的 呼叫約定 前導和後導程式碼有一些關鍵區別。
編譯器(或彙編程式設計師)在中斷向量表中寫入指向該中斷處理程式的指標。
一個非常常見的問題是在中斷程式中執行“太多”操作。遺憾的是,症狀通常只在兩個不同的中斷程式幾乎同時觸發時才會出現,從而導致難以除錯的間歇性錯誤以及許多相互指責。不幸的是,編寫了一箇中斷程式的人指出,他的程式單獨執行時工作正常,而編寫了另一箇中斷程式的人指出,他的程式單獨執行時工作正常,但他們經常互相指責,當這兩個中斷同時發生時出現的錯誤。中斷程式(可能是 UART 中斷處理程式,但也可能是其他看似無關的中斷程式)執行時間“過長”的一個常見症狀是丟失了一些,但不是全部,透過 UART 傳入的字元流中的字元。[4]
由於很難計算中斷處理程式需要多少時間,因此通常直接測量中斷處理程式實際需要多少時間。一種流行的除錯技術是編寫中斷處理程式,使中斷處理程式在每個中斷程式的開始處將測試引腳置位為高電平,並在每個中斷程式的結束處將測試引腳置位為低電平。連線到該引腳的示波器將顯示該中斷處理程式的實際執行時間。[4]