3

在基于 ARM 的项目上开发时,我们会随机中止数据,也就是说,当我们使用它时,我们会得到一个数据中止中断。但是,当我们使用 r14 或 r13 检查寄存器映射时,即使检查函数回调,数据中止也不总是在同一点上。无论如何,我可以准确地获得有关数据中止的根本原因的信息吗?我已经尝试了 ref 2,但是当我捕获有关中断的数据时无法得到相同的点。

相关 ARM Data Abort 错误异常调试 ARM: HOW TO ANALYZE A DATA ABORT EXCEPTION

4

1 回答 1

1

如上面的 Keil 链接中所述,检查链接寄存器 (r14) 将显示触发数据中止的指令。从那里你必须弄清楚它为什么会触发数据中止以及它是如何发生的,这是困难的部分。

根据我的经验,最有可能发生的是您访问了一个无效的指针。由于许多原因,它可能无效。以下是一些候选人:

  1. 您在初始化之前使用了指针
  2. 您使用了它之后的指针,或者包含的内存,已被释放(随后在另一个函数分配它时被修改)
  3. 指针因堆栈溢出而损坏
  4. 指针被其他不相关的、行为不端的代码破坏了,这些代码正在践踏内存
  5. 指针作为局部变量在堆栈上分配,然后在分配函数退出后使用
  6. 指针的类型对齐不正确(例如,尝试将 0x4001 作为 uint32_t 访问)

如您所见,很多事情都可能是 ARM 数据中止的根本原因。找到根本原因是 ARM 软件/固件开发如此有趣的部分原因!祝你好运解决你的难题。

于 2012-07-13T18:33:58.023 回答