8051 interrupt

Posted by: 邱小新 at 下午1:42 in ,
  1. 8051 的中斷服務功能,可使程式強制中斷去執行需要即時處理的副程式,進而提升執行效率。
  2. 在 8051 中總共提供五個中斷來源。INT0,INT1,Timer0,Timer1,UART。
  3. 中斷源在 8051 中都有相對應的旗標,當中斷條件產生時,中斷源就會使其相對應的旗標值設定為 1。8051 會在每一個機械週期檢查這些旗標的狀態,若系統允許相對的中斷源產生中斷,且該中斷相對應的旗標值亦為 1 時,則 8051 會在執行完目前正在執行的指令後,將程式在記憶體中的位址存入堆疊中,並產生中斷服務副程式的呼叫,跳到該中斷所對應之中斷向量位址去執行,8051 執行該中斷服務副程式,直到 RETI 指令後才結束中斷副程式,再從堆疊中取出先前存入的位址值繼續執行被中斷的程式。
  4. 當一個中斷要求發生時,若中斷是被致能的,則 8051 會執行該中斷服務副程式。然而在執行中斷副程式中若有較高優先權的中斷源要求中斷,則 8051 會先暫停目前正在執行的中斷服務副程式,而立即執行這個較高優先權的中斷服務副程式。如果相同優先權或優先權較低的中斷源要求中斷,則 8051 將不予理會。另外,若兩中斷同時發生,則高優先權中斷源優先執行;但若優先權相同時,則依 INT0、Timer0、INT1、Timer1、UART 之順序先後執行。

中斷產生的要件

  1. 沒有任何事情可以停止高優先權的中斷運行,即使是另一個擁有高優先權的中斷。
  2. 一個擁有高優先權的中斷發生,可以強制停止另一個低優先權的中斷運行,讓自己先行。
  3. 一個擁有低優先權的中斷發生,只能在沒有任何中斷運行的條件下,才可以執行。
  4. 如果二個中斷同時發生,高優先權的中斷會先執行;如果是同樣優先權的中斷,則依 INT0、Timer0、INT1、Timer1、UART 之順序先後執行。

中斷發生時所做的事

  1. Program Counter push 進堆疊裏,low-byte 最先。
  2. 同一優先權及低優先權的中斷被阻塞。
  3. 在時間及外部中斷發生時,相對應的中斷旗標會被自動清除。
  4. Program Counter 轉換成相對應的中斷向量位置。
  5. 執行中斷程式。

中斷結束時所做的事

  1. Program Counter 堆疊裏 pop 出來。
  2. 中斷旗標被恢復成中斷前的值。
  3. 所以在時間及外部中斷發生時,中斷程式中就不需要為了防止再次中斷發生,而自己去操作中斷旗標
  4. 繼續執行中斷前的程式。

中斷必須保護的暫存器

  1. ACC
  2. B
  3. DPTR (DPH/DPL)
  4. PSW
  5. R0~R7

中斷時 register bank 的使用

  1. R0~R7 有 4 個 register bank 可以使用。
  2. SDCC 發現你在中斷使用 bank0 時,都會對 R0~R7 做 push/pop 動作。
  3. SDCC 發現你在中斷使用 bank1~3 時,不會對 R0~R7 做 push/pop 動作。
  4. SDCC 的中斷函數跟 main 函數沒有放在一起編譯時,則不會有任何最佳化作用,也就是中斷必須保護的暫存器通通都會做 push/pop,表示 register bank 的使用無效。
  5. 因為相同優先權不會互相中斷執行,所以相同優先權的 interrupt 可以使用同一個 bank。
  6. 因為高優先權會中斷低優先權的執行,所以不同優先權的 interrupt 不可使用同一個 bank(bank0 除外)。
  7. 最好按照下列方式使用:
    1. bank0: main routine
    2. bank1: low-priority interrupt
    3. bank2: high-priority interrupt
  8. 如果要節省記憶體的使用,就全部用 bank0 吧。

3 意見

如果高優先權中斷時低優先權又發生中斷,等到高優先權中斷執行後會回到MAIN()還是進入低優先權中斷。

張貼留言