c - AVR32 异常 : Bus Data Error

标签 c exception embedded avr32

最近,我的嵌入式软件出现了一种对我来说很奇怪的行为。

我得到了什么: 运行 32 位 AVR32 Controller ,从外部 SDRAM 启动程序,因为文件太大无法直接从微 Controller 闪存启动。由于物理内存映射,内存区域分为:

stack (start at 0x1000, length of 0xF000) ( < 0x1000 is protected by the MPU)

EBI SDRAM (start at 0xD0000000, length of 0x00400000).


发生了什么:不幸的是我遇到了一个异常,该异常是不可重现的。查看我给定的堆栈跟踪,发生以下事件不规则:

Name: Bus error data fetch - Event source: Data bus - Stored Return Address: First non-completed instruction

此外,堆栈指针具有有效值,而发生异常的地址(获取指令的最后一个入口点)指向内存 nirvana(例如 0x496e6372,0x5...,0x6... 附近的某物) ).我猜,这一定是手册中提到的“第一条未完成的指令”。但是,我的源代码中的那一行总是相同的:通过指针访问数据数组中的成员函数。

      if(mSomeArray[i])
      {
         mSomeArray[i]->someFunction(); <-- Crash
      }

问题是:添加或删除其他源代码会使事件消失并再次返回。


我的想法:某些东西正在破坏我的内存(映射)。这可能会导致什么样的错误?

  • 缓冲区溢出?
  • SDRAM Controller 可能已关闭,因此它丢失了一些数据。这不是不可能,而是不太可能
  • 堆栈足够大,我已经用水印检查过了
  • 数据总线速率和 AVR 时钟设置正确

如何解决这个问题: 更多断言?不幸的是我不能用 AVRStudio 调试它。任何人的提示或想法?还是我遗漏了一些明显的东西?


编辑:

用户提到的方法:

  • 检查函数指针和数组项的地址
  • 覆盖栈数组
  • 没有正确编写中断
  • 未初始化的指针
  • 在崩溃情况下通过 i 检查数组访问
  • 使用异常处理程序地址进行非法内存访问
  • 使用snprintf代替sprintf

线程的后期附录:问题是旧软件模块中的数组访问错误(设置了错误的索引),这与我的模块无关。我偶然发现了这个,很奇怪它没有早点出现,我花了很长时间才找到代码行。我将唯一给出的答案标记为正确的解决方案。

感谢大家的意见。

保重(您的软件;))

最佳答案

这里有一些想法:

  1. 检查“i”以确保它在数组范围内。
  2. 检查即将被调用的函数指针的地址。它应该在 SDRAM 中有一个地址。
  3. 查看芯片是否有访问非法内存时跳转到的异常处理程序地址。一旦你在那里,输出一些调试数据
  4. 如果您的调试器允许,在编写时在 someFunction() 上设置一个断点。当它覆盖函数指针时,这会捕获一些其他函数。

关于c - AVR32 异常 : Bus Data Error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32712816/

相关文章:

c - #define 的优点而不是在嵌入式中创建函数

c - 执行错误: Part of C code compiled but not being executed properly in ECM

c - 提取交错 float 据

c - 取消对匿名结构指针的强制转换是否违反严格的别名?

rust - 使用 Xargo 从特定源编译 `core`

java - 根据 Spring Boot 成功或错误获取两个对象

Ruby 构造函数和异常

c - 结构困惑

c - 警告 : assignment makes integer from pointer without a cast

Delphi - 如何重新启用调试器异常通知?