打印

swi 终于是搞定了你

[复制链接]
146|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
小小的人呀|  楼主 | 2018-10-5 17:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
哈哈,每天早上半小时书真是没白看,今天终于搞定了SWI。才发现以前自己看书是多么的不认真,认真起来,5分钟就搞定了,哈哈,开心~~

以下是关键代码:

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代码里去。

真正自己做了才发现其实不难,以前是没用心,

  天天早上看下书,

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

399

主题

399

帖子

0

粉丝