Keil C51對C語言的關鍵詞擴展之十四: interrupt

8051/8052系列單片機標準向量表:

中斷號       描述    地址             
0 外部中斷0  0003h
1 定時/計數器0  000Bh
2 外部中斷1  0013h
3 定時計數器1  001Bh
4 串口  0023h
5 定時計數器2(8052)   002Bh

衆多廠商爲其51系列單片機添加了更多的中斷。Keil Cx51編譯器支持多達32箇中斷函數(中斷號0-31)。下表列出了這32箇中斷向量入口地址:

 中斷號      入口地址     
0 0003h
1 000Bh
2 0013h
3 001Bh
4 0023h
5 002Bh
6 0033h
7 003Bh
8 0043h
9 004Bh
10 0053h
11 005Bh
12 0063h
13 006Bh
14 0073h
15 007Bh
 
 中斷號     入口地址    
16 0083h
17 008Bh
18 0093h
19 009Bh
20 00A3h
21 00ABh
22 00B3h
23 00BBh
24 00C3h
25 00CBh
26 00D3h
27 00DBh
28 00E3h
29 00EBh
30 00F3h
31 00FBh
函數聲明時使用interrupt關鍵詞,該函數將被編譯器視爲中斷服務程序,例如:

unsigned int  interruptcnt;
unsigned char second;

void timer0 (void) interrupt 1 using 2  {
  if (++interruptcnt == 4000)  {    
    second++;                       
    interruptcnt = 0;               
  }
}
interrupt 關鍵詞後跟一個整數,表示中斷號,取值範圍0-31。中斷號必須爲常數,不允許使用操作符表達式。

interrupt關鍵詞影響了該函數的目標代碼:

1)該中斷服務程序被調用時,寄存器ACC、B、DPH、DPL、PSW的內容被壓入堆棧;

2)該函數聲明時,如果沒有使用using關鍵詞指定寄存器組,則在其被調用時,它所使用的所有工作寄存器的內容被壓入堆棧;

3)被壓入堆棧的工作寄存器、特殊寄存器在該退出中斷服務程序前被恢復;

4)該中斷服務程序以RETI指令結束;

下面的程序介紹了interrupt關鍵詞的用法,展示了用於進入、退出中斷服務程序的彙編代碼,using關鍵詞則是爲了指定該中斷服務程序使用與非中斷程序不同的工作寄存器組,須要注意的是,下面的中斷服務程序沒有使用工作寄存器,所以進入函數時切換寄存器組的代碼被優化掉了:

   1        extern bit alarm;
   2        int alarm_count;
   3
   4
   5        void falarm (void) interrupt 1 using 3  {
   6   1      alarm_count *= 2;
   7   1      alarm = 1;
   8   1      }


下面是對應的彙編代碼:
0000 C0E0       PUSH  ACC	/* 進入中斷服務程序時,ACC寄存器內容壓棧 */
0002 C0D0       PUSH  PSW	/* 進入中斷服務程序時,PSW寄存器內容壓棧 */
0004 E500   R   MOV   A,alarm_count+01H
0006 25E0       ADD   A,ACC
0008 F500   R   MOV   alarm_count+01H,A
000A E500   R   MOV   A,alarm_count
000C 33         RLC   A
000D F500   R   MOV   alarm_count,A
000F D200   E   SETB   alarm
0011 D0D0       POP   PSW	/* 退出中斷服務程序前,恢復PSW寄存器的內容 */
0013 D0E0       POP   ACC	/* 退出中斷服務程序前,恢復ACC寄存器的內容 */

0015 32         RETI

作爲中斷服務程序的函數必須遵循的規則:

1)中斷服務函數不能有參數;

2)中斷服務函數返回值類型必須爲void類型;

3)不能直接調用或者通過函數指針調用中斷服務函數,中斷服務函數只能由硬件自動調用,我們在程序中調用中斷服務函數,將引起RETI指令的執行,該指令被人爲執行,而其對應的硬件中斷請求並不存在,這將導致單片機硬件中斷系統產生不確定的致命錯誤;

4)Keil Cx51編譯器支持中斷號範圍0-31,具體可用的中斷號須要結合用戶所用的具體芯片手冊;




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章