没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
教你 如何找到导致程序跑飞的指令
更多资料请访问我的博客 blog.sina.com.cn/ifreecoding
调试嵌入式程序时 , 你是否遇到过程序跑飞最终导致硬件异常中断的问题?遇到这种问
题是否感觉比较难定位?不知道问题出在哪里 , 没有办法跟踪?尤其是当别人的程序踩了自
己的内存,那就只能哭了 :(
今天在论坛上看有同学求助这种问题,正好我还算有一点办法,就和大家分享一下。
解决办法非常非常简单 , 本文将以 Aduc7026 ( ARM7 内核 ) 和 LM3S8962 ( cortex 内核
,
STM32 也是 cortex 内核,同理)为例,讲讲解如何定位此种问题。
先说 ARM7 内核, cortex 内核稍微有一点复杂,后面再说。
ARM7 内核有多种工作模式,每种模式下有 R0~R15 以及 CPSR 共 17 个寄存器可以使
用 , 有关这些寄存器的细节我就不详细介绍了 , 详细的介绍请参考 “ 底层工作者手册之嵌入
式操作系统内核 ” 中的 2.2~2.3 节,这里只介绍与本文相关的寄存器。
其中 R14 又叫做 LR 寄存器,它被用来保存函数、中断调用时的返回地址,看到了吧
,
它保存了 “ 返回地址 ” ! 这不就是我们需要的么?就这么简单 , 发生异常中断时 , LR 寄存器
中保存的地址附近就会有导致异常的指令。
接下来我们再先了解一下相关的知识 , 然后再通过一个例子构造一个指令异常 , 然后再
反推找到产生异常的这条指令,做一个实例演练!
当程序跑飞时 , 绝大部分情况都会触发硬件异常中断 , 硬件异常中断的中断服务函数在
中断向量表中有定义,我们来看看 ARM7 的中断向量表,在 keil 开发环境里(以下例子是
在 keil 环境下介绍的 ) ,这个文件一般叫 startup.s ,如下:
Vectors: LDR PC, Reset_Addr
LDR PC, Undef_Addr
LDR PC, SWI_Addr
LDR PC, PAbt_Addr
LDR PC, DAbt_Addr
NOP /* Reserved Vector */
LDR PC, IRQ_Addr
LDR PC, FIQ_Addr
Reset_Addr: .word Reset_Handler
Undef_Addr: .word ADI_UNDEF_Interrupt_Setup
SWI_Addr: .word ADI_SWI_Interrupt_Setup
PAbt_Addr: .word ADI_PABORT_Interrupt_Setup
DAbt_Addr: .word ADI_DABORT_Interrupt_Setup
IRQ_Addr: .word ADI_IRQ_Interrupt_Setup
FIQ_Addr: .word ADI_FIQ_Interrupt_Setup
ARM7 的中断向量表比较简单 , 只有 7 种中断 , 它把所有正常的中断都放到了 SWI 、 IR Q
和 FIQ 中了 , 那么本文所介绍的异常情况将会触发 Undef 、 PAbt 或者 DAbt 异常中断 , 至于
是哪种就需要看具体的原因了。
指令 A // 触发异常
指令 B
比如说当指令 A 无法执行时,它就会触发异常中断,硬件就会自动将这条指令后面的
ifreecoding
- 粉丝: 130
- 资源: 27
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页