自定义中断向量的情况说明
#pragma CODE_SEG NON_BANKED
// 声明外部中断函数
extern void
Timer0_C0(void);
extern void
_Startup(void); //Startup routine */
#pragma CODE_SEG NON_BANKED
__interrupt void UnimplementedISR(void)
//定义在NON_BANKED区
{
asm BGND;
//空的中断函数
}
typedef void (*near tIsrFunc)(void); //定义了函数指针类型
//定义一个函数指针数组中断表,从0xFF80地址开始装载各个中断函数的首地址
const tIsrFunc _vect[] @0xFF80 =
{
UnimplementedISR,
UnimplementedISR,
UnimplementedISR,
UnimplementedISR,
UnimplementedISR,
UnimplementedISR,
UnimplementedISR,
UnimplementedISR,
UnimplementedISR,
UnimplementedISR,
UnimplementedISR,
UnimplementedISR,
UnimplementedISR,
UnimplementedISR,
UnimplementedISR,
UnimplementedISR,
UnimplementedISR,
UnimplementedISR,
UnimplementedISR,
UnimplementedISR,
UnimplementedISR,
UnimplementedISR,
UnimplementedISR,
UnimplementedISR,
UnimplementedISR,
UnimplementedISR,
UnimplementedISR,
UnimplementedISR,
UnimplementedISR,
UnimplementedISR,
UnimplementedISR,
UnimplementedISR,
UnimplementedISR,
UnimplementedISR,
UnimplementedISR,
UnimplementedISR,
UnimplementedISR,
UnimplementedISR,
UnimplementedISR,
UnimplementedISR,
UnimplementedISR,
UnimplementedISR,
UnimplementedISR,
UnimplementedISR,
UnimplementedISR,
UnimplementedISR,
UnimplementedISR,
UnimplementedISR,
UnimplementedISR,
UnimplementedISR,
UnimplementedISR,
UnimplementedISR,
UnimplementedISR,
UnimplementedISR,
UnimplementedISR,
Timer0_C0,
UnimplementedISR,
UnimplementedISR,
UnimplementedISR,
UnimplementedISR,
UnimplementedISR,
UnimplementedISR,
UnimplementedISR,
_Startup
};
在编译的时候,假如出现以下的错误提示
ERROR: Vector allocated at absolute address 0xFFFE overlaps with sections placed in segment xxxx
则说明_Startup()函数的绝对地址约束存在二义性。
可以直接打开对应工程文件的PRM文件,将最后的 “VECTOR 0 _Startup ”注释掉。
因为这句话的意思就是值,将_Startup 函数放在 0号中断向量的地方。
而上面我们自己定义的_vect[]表,的最后一个也是_Startup()函数,并且制定了绝对地址。如此一来就和VECTOR 0 _Startup 产生了冲突!