以下是关键代码:
extern void SWI_Handler(void); //在startup.s里定义的SWI中断处理地址 为什么可以用函数形式声明呢??
unsigned install_handler(unsigned routine,unsigned *vector)
{
unsigned vec,old_vec;
vec=(routine -(unsigned)vector - 8)>>2; //取得中断处理程序地址量,即跳转地址偏移量,用来构成跳转指令。
if(vec&0xff000000) //确认偏移量在32M内
{
return 0;
// printf("handler greater than 32Mbytes from vector"); //不能用这个
}
vec=0xea000000|vec; //构造跳转指令,跳到中断处理程序
old_vec=*vector; //貌似没什么用,还不知道用处
*vector=vec; //
return old_vec;
}
install_handler((unsigned)SWI_Handler,(unsigned *)0x08);在main()里调用,直接写SWI中断地址0x08,注意是指针型号的,所以要强制转换
在应用程序里构造中断跳转 可能的好处是不要再去理会STARTUP.S)(也不一定),还没悟到有什么其他好处还是要理解其做法吧:构造一条指令,从SWI中断地址0x08处跳转到C代码里的中断处理程序中去,只需把中断处理程序所在地址相对于SWI中断地址的偏移量放入指令0xEA中(当作低24位),再执行该指令即可跳转到C代码里去。
真正自己做了才发现其实不难,以前是没用心, |