
120
|
第五章
中斷總是十分嚇人,是嵌入式系統與傳統應用程式軟體最主要的差異,中斷天外飛來一
筆的改變程式流程,只能呼叫特定的函數(通常不是除錯函數),需要十分快速,是少數
仍然以組合語言撰寫的程式,難以找出中斷裡的臭蟲,根據定義,它們是發生在正常程
式流程之外。
中斷並非天生就這麼難搞,只要瞭解了中斷發生的細節,就會成為設計軟體時十分有用
的工具。
回顧到目前為止的內容,希望讀者記得將處理器與介面看作軟體 API(參看 36 頁的「閱
讀 Datasheet」),以及函數指標也不是那麼嚇人(參看 64 頁的「函數指標並不那麼嚇
人」),接下來介紹中斷發生時的細節時必須將這兩個觀念牢記於心:
1. 中斷請求(interrupt request,IRQ)在處理器內部發生,可能來自週邊、軟體或是
系統錯誤。
2. 處理器會儲存目前所在位置(情境)。
3. 處理器從中斷向量表(interrupt vector table)找出對應的回呼函數(callback
function)。
4. 呼叫回呼函數(也稱為
中斷服務常式
(
interrupt service routine
,
ISR
),或中斷處
理常式)。
有些中斷是很小的高優先權工作,完成對應的 ISR 後,處理器會回復儲存的情境繼續原
先執行的工作像沒事一樣。大多數週邊中斷都是這樣:輸入線路、通訊路徑、計時器、
週邊、ADC 等等。
其他的中斷比較像是例外(exception),處理系統錯誤且不會回到原有執行路徑。例如
處理器試著執行可能造成記憶體錯誤,或除以零錯誤的問題指令時就會發生中斷,或是 ...