sdcc 中斷使用中的一個(gè)問(wèn)題
在sdcc中,中斷處理函數(shù)使用關(guān)鍵字__interrupt標(biāo)識(shí),后面跟上中斷號(hào),8051中斷號(hào)列表如下:
Interrupt#DescriptionVectorAddress0External00x00031Timer00x000b2External10x00133Timer10x001b4Serial0x00235Timer2(8052)0x002b
雖然看上去很簡(jiǎn)單,但是在使用過(guò)程中還出現(xiàn)了一個(gè)小問(wèn)題,由于我將程序分成了兩個(gè)部分,main.c和timer.c,而在timer.c中的定時(shí)器中斷處理函數(shù)timer0_isr始終是不能被執(zhí)行,檢查程序呢也未發(fā)現(xiàn)什么原因,通過(guò)查看sdcc中的源代碼和上網(wǎng)查找timer部分代碼,也未發(fā)現(xiàn)timer0初始化有任何問(wèn)題,頓時(shí)就郁悶了。但是也發(fā)現(xiàn)兩個(gè)一個(gè)不同之處,就是在main函數(shù)之前對(duì)中斷處理函數(shù)做了一個(gè)聲明,于是我就在我的程序中加上了這個(gè)聲明,程序終于調(diào)用了中斷處理函數(shù),特此記錄一下。完整的程序如下:
/*timer.c*/
#include
#defineOSC_FREQ12000000UL
#defineTIMER_MODE00x00
#defineTIMER_MODE10x01
#defineTIMER_MODE20x02
#defineTIMER_MODE30x03
volatileunsignedintcount=0;
voidtimer0_isr(void)__interrupt1
{
count++;
TH0=(65536-1000*(OSC_FREQ/12000000))>>8;
TL0=(65536-1000*(OSC_FREQ/12000000))&0x00FF;
}
voidtimer0_init(void)
{
TMOD&=0xF0;
TMOD|=TIMER_MODE1;/*Timer0workon16-bittimermode*/
TH0=(65536-1000*(OSC_FREQ/12000000))>>8;
TL0=(65536-1000*(OSC_FREQ/12000000))&0x00FF;
ET0=1;/*Enabletimer0interrupt*/
EA=1;
TR0=1;/*Turnontimer0*/
}
voiddelayms(unsignedintn)
{
while(count<=n);
count=0;
}
/*timer.h*/
#ifndef__TIMER_H
#define__TIMER_H
externvoidtimer0_init(void);
externvoiddelayms(unsignedintn);
#endif/*__TIMER_H*/
/*main.c*/
#include
#include"timer.h"
#defineled1P2_0
voidtimer0_isr(void)__interrupt1;
voidmain(void)
{
timer0_init();
while(1){
led1=0;
delayms(1000);
led1=1;
delayms(1000);
}
}
注:經(jīng)驗(yàn)證,在Keil中未出現(xiàn)該問(wèn)題。