嵌入式系統筆記:ISR
ISR 是什麼?
全稱 Interrupt Service Routine,翻譯為中文則是「中斷服務常式」(?)。
是中斷發生時由 CPU 執行的一段特殊函式,用來處理外部或內部事件。
ISR 的流程
觸發中斷,中斷原因可能是:
外部中斷 (ex:按鍵)
內部中斷 (ex:定時器溢位、資料接收完成)
軟體中斷:OS 或應用程式主動觸發
CPU 暫停目前正在執行的程式、並儲存狀態
跳到對應的 ISR 執行
ISR 處理完畢後,CPU 回到原本的程式繼續執行
實作 ISR 的注意事項
核心概念:立即、簡短、避免等待性操作。
- ISR 通常有較高的權重,會打斷比它權重低的程式
- 保持 ISR 的簡短
- 僅處理最必要的工作(ex: 紀錄 flag、讀寫 register)
- 硬體相關工作會放 ISR
- 不呼叫 system call、IO 等需要等待的指令
- 耗時動作會丟回背景或主迴圈裡
- 保護共用參數:通常會以
volatile宣告 - 清除 interrupt 的 flag:沒清掉會陷入 ISR 迴圈
- ISR 不該有 return 的值
下面是一個考試上常見的糾錯程式:
__interrupt int timer_isr(void) {
static int counter = 0;
counter++;
char *buf = (char*)malloc(100); // 錯誤:ISR 內呼叫 malloc
if (buf != NULL) {
sprintf(buf, "Counter = %d\n", counter); // 錯誤:ISR 內呼叫 printf/sprintf
free(buf);
}
return counter; // 錯誤:ISR 不該有 return value
}
總之,ISR 應該寫得很簡單,只能做必要的 flag 設定、計數或讀寫 register。
留言
張貼留言