C51編譯器-語(yǔ)言擴(kuò)展(5)-中斷函數(shù)
掃描二維碼
隨時(shí)隨地手機(jī)看文章
Interrupt Functions中斷函數(shù)
8051及其變種提供了一定數(shù)量的硬件中中斷,這些中斷有:
Interrupt Number Interrupt Description Address
0 EXTERNAL INT 0 0003h
1 TIMER/COUNTER 0 000Bh
2 EXTERNAL INT 1 0013h
3 TIMER/COUNTER 1 001Bh
4 SERIAL PORT 0023h
隨著生產(chǎn)商制出新器件,增加了更多的中斷。Cx51支持多達(dá)32個(gè)中斷(0-31)。使用下表的中斷向量決定中斷號(hào)
Interrupt Number Address Interrupt Number Address
0 0003h 16 0083h
1 000Bh 17 008Bh
2 0013h 18 0093h
3 001Bh 19 009Bh
4 0023h 20 00A3h
5 002Bh 21 00ABh
6 0033h 22 00B3h
7 003Bh 23 00BBh
8 0043h 24 00C3h
9 004Bh 25 00CBh
10 0053h 26 00D3h
11 005Bh 27 00DBh
12 0063h 28 00E3h
13 006Bh 29 00EBh
14 0073h 30 00F3h
15 007Bh 31 00FBh
Cx51編譯器提供了一種在中斷時(shí)凋用C函數(shù)的方法。這樣就可以用C和編寫中斷服務(wù)程序。程序員只需要關(guān)心中斷號(hào)和選用的寄存器組。編譯器自動(dòng)地生成中斷向量和中斷服務(wù)程序的入口及出口代碼。函數(shù)的interrupt屬性,在聲明的時(shí)候指定當(dāng)前函數(shù)是一個(gè)斷函數(shù)。例:
void timer0 (void) interrupt 1 using 2 {
if (++interruptcnt == 4000) { /* count to 4000 */
second++; /* second counter */
interruptcnt = 0; /* clear int counter */
}
}
函數(shù)interrupt屬性的參數(shù)是一個(gè)0-31的整數(shù)。在函數(shù)的原型中不允許出現(xiàn)表達(dá)式和interrupt屬性。Interrupt屬性對(duì)函數(shù)代碼產(chǎn)生如下影響:
(1)如果需要,在函數(shù)的高用的時(shí)候SFR,ACC,B,DPH,DPL和PSW的值都保存在堆棧中
(2)如果不用不著using關(guān)鍵字聲明所用的寄存器組時(shí),在中斷中用到的所有的工作寄存器都保存在堆棧中,
(3)工作寄存器和特殊的寄存器都保存在堆棧中,在中斷程序退出時(shí)恢復(fù)這些寄存器
(4)函數(shù)以8051指令RETI結(jié)束
中斷函須遵守以下規(guī)則:
(1)中斷函數(shù)沒(méi)有參數(shù)。如果帶有了參數(shù),編譯器將報(bào)錯(cuò)
(2)中斷函數(shù)沒(méi)有返回值,并且必須被聲明為void。如果試圖返回一個(gè)值編譯器將報(bào)錯(cuò)。但是如果聲明函數(shù)返回值是int類型,將會(huì)被編譯器忽略
(3)編譯器檢查對(duì)中斷函數(shù)的直接調(diào)用,并且直接拒絕這種調(diào)用。直接調(diào)用中斷過(guò)程是沒(méi)有意義的,因?yàn)橥顺鲋袛喑绦驎r(shí)要執(zhí)行RETI指令,從而影響了8051芯片的硬件中斷系統(tǒng)。因?yàn)橛布蠜](méi)有中斷請(qǐng)求,這個(gè)返回指令的結(jié)果是不確定,并且通常是致命的。也不要通函數(shù)指針間接地調(diào)用一個(gè)中斷函數(shù)。
(4)編譯器為每個(gè)中斷生成一個(gè)中斷向量。為中斷向量生的代碼是跳轉(zhuǎn)到中斷函數(shù)的起始處。中斷向量的生成可以通過(guò)在Cx51的命令行使用NOINTVECTOR控制指令禁止。在這種情況下,你必須為每個(gè)匯編模塊提供中斷向量。
(5)Cx51允許中斷號(hào)的范圍是0-31。參考8051的器件手冊(cè)查看哪些中斷是可用的(6)在中斷服務(wù)程序中調(diào)用的函數(shù)使用的寄存器組必須與中斷服務(wù)程序使用的寄存器組一致。如果NOAREGS指令沒(méi)有顯式地指定,編譯器就會(huì)為這個(gè)函靈數(shù)生成使用絕對(duì)地址訪問(wèn)選定的寄存器(使用suing或使用REGISTERBANK指令)的代碼。如果函數(shù)使用的寄存器組不是當(dāng)前選擇的,就會(huì)產(chǎn)生不可預(yù)料的后果