S3C2440定時(shí)器4中斷測(cè)試程序
ADS編譯器中: void __irq IRQ_Eint0(void);
Keil編譯器中 : void IRQ_Eint0(void) __irq;
但是其意義一樣,它所完成的任務(wù)是標(biāo)識(shí)該函數(shù)為中斷函數(shù),在編譯器編譯是調(diào)用此函數(shù)時(shí),先保護(hù)函數(shù)入口現(xiàn)場(chǎng),然后執(zhí)行中斷函數(shù),函數(shù)執(zhí)行完畢,恢復(fù)中斷現(xiàn)場(chǎng),這整個(gè)過程不需要用戶重新編寫代碼來完成,由編譯器自動(dòng)完成。因而這也給不具備中斷嵌套功能的ARM系統(tǒng)帶來了問題,若使用 __irq 時(shí)有中斷嵌套產(chǎn)生,這現(xiàn)場(chǎng)保護(hù)就會(huì)混亂。中斷嵌套處理可以自己編寫中斷入口現(xiàn)場(chǎng)保護(hù)代碼,并不使用 __irq 標(biāo)識(shí)符號(hào)。(小呆:具體如何編寫可以嵌套的中斷這里暫時(shí)不做研究。
總結(jié)如下
1、若不想自己編寫中斷入口現(xiàn)場(chǎng)保護(hù)代碼,而且使用中無(wú)中斷嵌套,在中斷函數(shù)中用 __irq 來標(biāo)識(shí)我們的中斷函數(shù),否則出錯(cuò);
2、若程序中要使用中斷嵌套,對(duì)于無(wú)中斷嵌套功能的ARM來說,一定要自己編寫中斷入口現(xiàn)場(chǎng)保護(hù)代碼,而且不能用 __irq 標(biāo)識(shí)我們的中斷函數(shù),否則出錯(cuò)。
__irq關(guān)鍵字
在ADS編譯器中,“__irq”專門用來聲明IRQ中斷服務(wù)程序,如果用“__irq”來聲明一個(gè)函數(shù),那么該函數(shù)表示一個(gè)IRQ中斷服務(wù)程序,編譯器便會(huì)自動(dòng)在該函數(shù)內(nèi)部增加中斷現(xiàn)場(chǎng)保護(hù)的代碼。同樣一個(gè)函數(shù),如果將關(guān)鍵字“__irq”去掉,那么編譯器便不會(huì)增加現(xiàn)場(chǎng)保護(hù)的代碼,而只是作為一個(gè)普通函數(shù)來處理。
現(xiàn)在大家應(yīng)該對(duì)“__irq”關(guān)鍵字有了一定的了解,那么,是不是所有的IRQ中斷服務(wù)程序都需要使用“__irq”關(guān)鍵字聲明呢?其實(shí),這取決于獲取“中斷服務(wù)程序地址”的方法:
如果在執(zhí)行中斷服務(wù)函數(shù)之前沒有對(duì)中斷現(xiàn)場(chǎng)進(jìn)行保護(hù),那么中斷服務(wù)函數(shù)必須要使用“__irq”關(guān)鍵字進(jìn)行聲明。例如,在0x0000 0018處執(zhí)行指令“LDR PC, [PC, #-0xff0]”,此時(shí)對(duì)應(yīng)的中斷服務(wù)函數(shù)必須要使用“__irq”關(guān)鍵字進(jìn)行聲明;如果在執(zhí)行中斷服務(wù)函數(shù)之前已經(jīng)對(duì)中斷現(xiàn)場(chǎng)進(jìn)行了保護(hù),那么中斷服務(wù)函數(shù)不能使用“__irq”關(guān)鍵字進(jìn)行聲明。
//=========================================
// NAME: main.c
// DESC: 內(nèi)部定時(shí)器4LED燈延時(shí)
//=========================================
#define U32 unsigned int
#define _ISR_STARTADDRESS 0x33ffff00
#define pISR_TIMER4
#define rSRCPND
#define rINTMSK
#define rINTPND
#define rTCFG0
#define rTCFG1
#define rTCON
#define rTCNTB4
#define rGPBCON
#define rGPBDAT
#define rGPBUP
void led_init(void)
{
}
void led_display(unsigned char data)
{
}
void timer4_init(void)
{
}
void __irq timer4_ISR(void)
{
}
void Main(void)
{
}
-------------------------------------
pISR_UNDEF=(unsigned)HaltUndef;
任何地址都可以看作變量的指針.
評(píng)論