ARM中swi(软中断)

swi 是 arm 的软件中断指令,大概是 software interrupt 的意思 执行完swi指令后,cpu会做几件事情:

  1. 将swi的下一条指令地址保存到 r14_svc 中
  2. 将当前 cpsr 保存到 spsr_svc 中
  3. 将cpu模式改为特权模式svc_mode, 即更改 cpsr 的低五位, cspr[4:0]=0b10011
  4. 切换到ARM状态, cspr[5]=0
  5. 禁止IRQ, cspr[7]=1
  6. 将 pc 置为 0x00000008, 即跳到中断向量的地方开始执行

其于CPU的这种行为,我们需要考虑几件事情:


  • cpu最后跳到0x00000008地址执行,而且该地址处只有4个字节可以使用。 
    这4个字节正好可以放置一条指令。那么显然这个指令要将pc跳到另一个地方。


如何实现呢?

首先考虑当前的环境和需求。

在我的这块开发板上,SRAM的地址空间为 0x30000000 ~ 0x34000000 所以最开始要将测试程序放到 0x30000000 开始的地方。当程序从 0x30000000 地址跑 起来之后,我们再去设置中断向量表,即在在代码中去设置 0x00000000 ~ 0x0000001c 这块地址空间的指令。

于是想到可以如下来实现:

- .global _start - _start: -     mov r8, #0 -     adr r9, vector_init_block -     ldmia {r0-r7} -     stmia {r0-r7}
- vector_init_block: -     b    reset_addr -     b    undefined_addr -     b    swi_addr -     b    prefetch_addr -     b    abort_addr


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部