嵌入式系統筆記:ISR

ISR 是什麼?

全稱 Interrupt Service Routine,翻譯為中文則是「中斷服務常式」(?)。

是中斷發生時由 CPU 執行的一段特殊函式,用來處理外部或內部事件。

 

ISR 的流程

  1. 觸發中斷,中斷原因可能是:

    •  外部中斷 (ex:按鍵)

    •  內部中斷 (ex:定時器溢位、資料接收完成)

    •  軟體中斷:OS 或應用程式主動觸發

  2. CPU 暫停目前正在執行的程式、並儲存狀態

  3. 跳到對應的 ISR 執行

  4. 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。

留言