tnblog
首页
视频
资源
登录

ARM 异常处理

2829人阅读 2024/6/30 17:17 总访问:3659822 评论:0 收藏:0 手机
分类: 嵌入式

ARM 异常处理

ARM 异常处理


ARM异常处理是ARM处理器处理特殊事件的机制,这些事件可能来自硬件或软件。

ARM异常类型的优先级


复位(Reset)最高优先级,可以中断任何其他异常。
数据中止(Data Abort)当访问内存时发生错误。
快速中断请求(FIQ - Fast Interrupt Request)用于需要快速响应的高优先级外部中断。
普通中断请求(IRQ - Interrupt Request)用于常规的外部中断。
预取指令中止(Prefetch Abort)当尝试从内存取指令时发生错误。
软件中断(SWI - Software Interrupt)由软件主动触发,通常用于系统调用。
未定义指令(Undefined Instruction)当遇到处理器无法识别的指令时触发。

异常向量表


简单来讲就是:统一管理所有异常情况。
当处理器遇到”异常”时,它会查看这个表。


举例:
假设你的手机死机了(未定义指令异常):
处理器查看表中的”异常”联系方式。
然后按这个地址找到对应的处理程序。

简单软中断


我们写一个简单的软中断程序,通过swi进行触发,然后使用sirq_handler方法进行处理,最后返回并继续往下执行。

  1. .text
  2. b main @0x00 reset
  3. nop @0x04 undef
  4. b sirq_handler @0x08 soft irq
  5. nop @0x0c prefecth abort
  6. nop @0x10 data abort
  7. nop @0x14 reserved
  8. nop @0x18 irq
  9. nop @0x1C fiq
  10. sirq_handler:
  11. stmfd sp!,{r0-r12,lr}
  12. add r2,#1
  13. sirq_handler_end:
  14. ldmfd sp!,{r0-r12,pc}
  15. main:
  16. ldr sp,=stack_buf
  17. mov r1,#1
  18. mov r2,#2
  19. swi 0x1
  20. cmp r2,#2
  21. moveq r4,#4
  22. movne r4,#6
  23. .data
  24. stack_buf:
  25. .space 15*4
  26. .end


当我们执行完swi命令后,将会触发软中断,会在前面异常向量表找到sirq_handler进行执行。
此时LR会记录swi的下一条指令的地址。
但是我们要对数据操作时需要缓存一下历史数据所以我们通过stmfd进行存储,并在异常处理完成后,通过ldmfd进行返回值。
然后继续执行下面相关指令。

这里值得注意的是我定义了一块存储空间,并且要将ldr的sp指向存储空间的地址,原因是如果不进行指定就会报错。
通过ldmfd从堆栈拿数据回来的时候会导致没权限,然后报错。

多个软中断


在有多个软中断的情况下,我们可以通过获取lr的地址,减4位获取到swi的地址,并且通过ldr获取到它的值,但是需要使用bic去掉高8位指令段,剩下的就是值,然后通过实际的值我们就可以实现不同的软中断不同的处理。

  1. .text
  2. b main @0x00 reset
  3. nop @0x04 undef
  4. b sirq_handler @0x08 soft irq
  5. nop @0x0c prefecth abort
  6. nop @0x10 data abort
  7. nop @0x14 reserved
  8. nop @0x18 irq
  9. nop @0x1C fiq
  10. sirq_handler:
  11. stmfd sp!,{r0-r12,lr}
  12. ldr r0,[lr,#-4]
  13. bic r0,#0xff000000
  14. cmp r0,#1
  15. addeq r2,#1
  16. cmp r0,#2
  17. subeq r2,#1
  18. sirq_handler_end:
  19. ldmfd sp!,{r0-r12,pc}
  20. main:
  21. ldr sp,=stack_buf
  22. mov r1,#1
  23. mov r2,#2
  24. swi 0x1
  25. cmp r2,#2
  26. moveq r4,#4
  27. movne r4,#6
  28. swi 0x2
  29. mov r0,#3
  30. .data
  31. stack_buf:
  32. .space 15*4
  33. .end


当执行到第一个软中断swi 0x1时。


执行到第二个软中断swi 0x2时。

B指令做跳转异常的缺陷


一是只能在32M范围的数据进行跳转,二是方法在其他地方将无法完成跳转。
所以我们这里可以做一点修改,将替换为ldr pc, _sirq_handler里面通过一个字符串来进行存储地址,并进行执行跳转。
这样既可以突破32M的范围限制,当方法在其他文件中同样可以进行跳转。


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价
这一世以无限游戏为使命!
排名
2
文章
657
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 : 好是好,这个对效率影响大不大哇,效率高不高
ASP.NET Core 服务注册生命周期
剑轩 : http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术