Board logo

标题: [求助]请问中断的写法有没有用到中断向量而不用中断号的啊 [打印本页]

作者: commandoccz    时间: 2008-4-1 10:14     标题: [求助]请问中断的写法有没有用到中断向量而不用中断号的啊

中断向量一般写法

#pragma CODE_SEG NON_BANKED
void interrupt中断号 ADO_Interrupt(void)
{
DisableInterrupt;
/*code*/
EnableInterrupt;
}
#pragma CODE_SEG DEFAULT_ROM

请问有没有不用中断号的方式啊,直接向量方式,头文件里面定义了中断向量,谢谢那位解答一下

作者: strongchen    时间: 2008-4-1 10:22

可以。比如可以在程序中定义一个中断函数:
#pragma CODE_SEG NON_BANKED
void interrupt ADO_Interrupt(void)
{
//DisableInterrupt;
/*code*/
//EnableInterrupt;
}
#pragma CODE_SEG DEFAULT_ROM
其中不定义中断号(另外,DisableInterrupt和EnableInterrupt也是不必要的,硬件会自动完成);
然后在PRM文件的最后加上这样的说明就可以了:
VECTOR ADDRESS 0xFFXX ADO_Interrupt
作者: commandoccz    时间: 2008-4-1 13:48

DG128的头文件里面有这样的定义,我该如何利用呢?
/**************** interrupt vector table ****************/
#define VReserved63 0x0000FF80
#define VReserved62 0x0000FF82
#define VReserved61 0x0000FF84
#define VReserved60 0x0000FF86
#define VReserved59 0x0000FF88
#define VReserved58 0x0000FF8A
#define Vpwmesdn 0x0000FF8C
#define Vportp 0x0000FF8E
#define Vcan4tx 0x0000FF90
#define Vcan4rx 0x0000FF92
#define Vcan4err 0x0000FF94
#define Vcan4wkup 0x0000FF96
#define VReserved51 0x0000FF98
#define VReserved50 0x0000FF9A
#define VReserved49 0x0000FF9C
#define VReserved48 0x0000FF9E
#define VReserved47 0x0000FFA0
#define VReserved46 0x0000FFA2
#define VReserved45 0x0000FFA4
#define VReserved44 0x0000FFA6
#define VReserved43 0x0000FFA8
#define VReserved42 0x0000FFAA
#define VReserved41 0x0000FFAC
#define VReserved40 0x0000FFAE
#define Vcan0tx 0x0000FFB0
#define Vcan0rx 0x0000FFB2
#define Vcan0err 0x0000FFB4
#define Vcan0wkup 0x0000FFB6
#define Vflash 0x0000FFB8
#define Veeprom 0x0000FFBA
#define VReserved33 0x0000FFBC
#define Vspi1 0x0000FFBE
#define Viic 0x0000FFC0
#define VReserved30 0x0000FFC2
#define Vcrgscm 0x0000FFC4
#define Vcrgplllck 0x0000FFC6
#define Vtimpabovf 0x0000FFC8
#define Vtimmdcu 0x0000FFCA
#define Vporth 0x0000FFCC
#define Vportj 0x0000FFCE
#define Vatd1 0x0000FFD0
#define Vatd0 0x0000FFD2
#define Vsci1 0x0000FFD4
#define Vsci0 0x0000FFD6
#define Vspi0 0x0000FFD8
#define Vtimpaie 0x0000FFDA
#define Vtimpaaovf 0x0000FFDC
#define Vtimovf 0x0000FFDE
#define Vtimch7 0x0000FFE0
#define Vtimch6 0x0000FFE2
#define Vtimch5 0x0000FFE4
#define Vtimch4 0x0000FFE6
#define Vtimch3 0x0000FFE8
#define Vtimch2 0x0000FFEA
#define Vtimch1 0x0000FFEC
#define Vtimch0 0x0000FFEE
#define Vrti 0x0000FFF0
#define Virq 0x0000FFF2
#define Vxirq 0x0000FFF4
#define Vswi 0x0000FFF6
#define Vtrap 0x0000FFF8
#define Vcop 0x0000FFFA
#define Vclkmon 0x0000FFFC
#define Vreset 0x0000FFFE
作者: strongchen    时间: 2008-4-1 13:51

把这里的函数名改成你的函数名就可以了。
作者: commandoccz    时间: 2008-4-1 14:10

#pragma CODE_SEG NON_BANKED
void interrupt Vatd0(void)
{

/*code*/

}
#pragma CODE_SEG DEFAULT_ROM
是这样吗
作者: commandoccz    时间: 2008-4-1 14:12

编译不通过
作者: strongchen    时间: 2008-4-1 14:47

什么错误提示?
作者: commandoccz    时间: 2008-4-1 14:50

难到头文件里面这个就没有作用吗?
作者: commandoccz    时间: 2008-4-1 14:52

expected: ~(IDENT)
main.c Line36
作者: commandoccz    时间: 2008-4-1 15:02

???
作者: strongchen    时间: 2008-4-1 16:25

把你的PROJECT打包贴出来看看?
作者: wangyueyouzi    时间: 2008-4-1 18:41

版主的意思是把
DG128的头文件里面的
/**************** interrupt vector table ****************/
后面的名字直接放到
#pragma CODE_SEG NON_BANKED
void interrupt ?(void)
{}
这个问号处就能用吗?不用在到.prm文件中去声明吗?
作者: commandoccz    时间: 2008-4-2 08:03

#include
#include
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"


#define BaudRate 115200
#define OSC_CLK 16000000
#define PLLClock (2*OSC_CLK*(SYNR+1)/(REFDV+1))


unsigned char n[]="hello,world";


void wait()
{
int i,j;
for(i=0;i<1000;i++)
for(j=0;j<1000;j++) ;


}

void ADCInit(void)
{
ATD0CTL2=0xC2; //AD模块上电, 快速清零, 无等待模式, 禁止外部触发, 中断开放
ATD0CTL3=0x20; // 每个序列4次转换, No FIFO, Freeze模式下继续转换
ATD0CTL4=0x89; // 10位精度, 2个时钟, ; PRS=9, divider=8
ATD0CTL5=0xA0; //右对齐无符号,单通道采样,通道0
ATD0DIEN=0x00; // 禁止数字输入
}

word AD_wData = 0;


/*-------AD0中断--------------------------*/


//void interrupt 22 Int_AD0(void)
//{
// DisableInterrupts;
// AD_wData = ATD0DR0; //Read out the Result Register
// PORTB = (byte)AD_wData;
// wait();
// EnableInterrupts;
//}
//#pragma CODE_SEG NON_BANKED

void interrupt Vatd0(void)
{

/*code*/

}
//#pragma CODE_SEG DEFAULT_ROM

/*-------系统时钟初始化------------------*/
void SysClockSet(void)
{
SYNR=4;
REFDV=1;
while(!CRGFLG_LOCK);
CLKSEL_PLLSEL=1;
}

/*-------串口初始化----------------------*/
void SCIInit()
{
SCI0BDL = (unsigned char)((PLLClock/ 2) / BaudRate / 16);
SCI0CR1=0; /*normal,no parity*/
SCI0CR2=0X2C; /*RIE=1,TE=1,RE=1*/
}

/*-------发射端程序----------------------*/
void SCITx(unsigned char text)
{
while (!(SCI0SR1&0x80)); /* wait for output buffer empty */
SCI0DRH=0;
SCI0DRL=text;
}

/*-------接收程序------------------------*/
unsigned char SCIRx(void)
{
unsigned char RxData;
while (!(SCI0SR1&0x20));
RxData=SCI0DRL;
return RxData;
}

void main()
{
int i,j;
DisableInterrupts;
//ADCInit();
//EnableInterrupts;


PORTB=0x00;
DDRB=0xFF;
SysClockSet();
SCIInit();
ADCInit();
while(1)
{
if(PORTB==0) PORTB=0x7f;
for(i=0;i<1000;i++)
for(j=0;j<1000;j++);
PORTB>>=1;
while(!ATD0STAT1_CCF0);
SCITx((byte)ATD0DR0);





//for(i=0;i<11;i++)
//{
//SCITx(n); //向串口发送HELLO WORLD
// }





}


}

作者: commandoccz    时间: 2008-4-2 08:31

其实我的意思就是能不能把头文件里面定义的中断向量表利用起来,就TI公司的MSP430用的IAR编译器,他的中断写法
#pragma vector = Vatd
__interrupt void ATD0_Interrupt(void)
{
/*code*/
}

他的头文件里面也是有类似的定义
作者: commandoccz    时间: 2008-4-2 08:36

我只是比较习惯直接用中断表写中断服务程序,所以 就想问问~~
写程序我有看头文件的习惯,想把里面的东西利用起来,不然岂不白定义
作者: strongchen    时间: 2008-4-2 10:06

这样做是可以的,所以我不知道你什么地方出错了。最好将整个PROJECT打包上传,而不是直接贴出来,这样我才可以进行编译,找到问题所在。
作者: superyongzhe    时间: 2008-4-2 12:08

谢谢
作者: commandoccz    时间: 2008-4-3 20:01

http://bbs.chinaecnet.com/uploadImages/SmartCar.rar
这个是我的工程文件,很简单的,什么都没有
作者: commandoccz    时间: 2008-4-3 20:02

上午有事了,现在才看网页
作者: 康桥人    时间: 2008-4-3 20:26

#pragma CODE_SEG NON_BANKED
void interrupt Vatd0(void)
{

/*code*/

}
#pragma CODE_SEG DEFAULT_ROM
这个地方就问题的
作者: commandoccz    时间: 2008-4-3 20:43

是啊~~那怎么改咧?是不是只能按照你说的在PRM文件里面添加
VECTOR ADDRESS 0xFFXX ATD0_Interrupt

作者: 康桥人    时间: 2008-4-4 20:23

不是的,还可以用中断号的,不用改PRM文件!
作者: strongchen    时间: 2008-4-7 11:22

Vatd0只是给中断入口地址本身定义一个名称,而中断函数地址是要放入这个地址中去的地址,它们是不同的。建议还是用PRM文件定义的方式来做。
作者: achao86926    时间: 2009-2-28 11:26

谢谢楼主,看了你们上面的讨论,我终于知道中断函数是怎么用的了。以后还要多向大家学习啊!
作者: azureblue    时间: 2009-3-7 16:05

照strongchen说的那样写ISR,编译倒是可以通过,不过会有Warning,说Predefined segment ‘DEFAULT_ROM’used,意思应该是'使用了预定义的ROM段',这究竟算是警告呢,还是算是提示呢?
如果算为警告,有什么隐患吗?strongchen?

作者: strongchen    时间: 2009-3-9 10:47

这是个警告,“DEFAULT_ROM”必须为非分页地址,否则会出错。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0