AVR32 异常:总线数据错误
AVR32 exception: Bus Data Error
最近,我的嵌入式软件遇到了一个对我来说很奇怪的行为。
我得到: 运行一个32位AVR32控制器,从外部SDRAM启动程序,因为文件太大无法直接启动微控制器闪光灯。由于物理内存映射,内存区域分为:
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
此外,堆栈指针具有有效值,而发生异常的地址(获取指令的最后入口点)指向内存必杀技(例如0x496e6372,0x5...,0x6..附近的东西) ..).我想,这一定是手册中提到的 "First non-completed instruction"。但是,我的源代码中的那一行总是相同的:通过指针访问数据数组中的成员函数。
if(mSomeArray[i])
{
mSomeArray[i]->someFunction(); <-- Crash
}
问题是:添加或删除其他源代码会使事件消失并再次 return。
我想到了什么: 有东西在破坏我的记忆(映射)。这可能会导致什么样的错误?
- 缓冲区溢出?
- SDRAM 控制器可能已关闭,因此它丢失了一些数据。这不是不可能,而是不太可能
- 堆栈足够大,我已经用水印检查过了
- 数据总线速率和 AVR 时钟设置正确
如何解决这个问题:更断言?不幸的是我不能用 AVRStudio 调试它。任何人的提示或想法?还是我遗漏了一些明显的东西?
编辑:
用户提到的方法:
- 检查函数指针和数组条目的地址
- 覆盖堆栈数组
- 没有正确写入中断
- 未初始化指针
- 在崩溃情况下通过
i
检查数组访问
- 使用异常处理程序地址进行非法内存访问
- 使用
snprintf
代替sprintf
线程的后期附录:问题是旧软件模块中的数组访问错误(设置了错误的索引),这与我的模块无关。我偶然发现了这个,很奇怪它没有早点出现,我花了很长时间才找到代码行。我将唯一给出的答案标记为正确的解决方案。
谢谢大家的意见。
保重(您的软件;))
这里有一些想法:
- 检查 'i' 以确保它在数组范围内。
- 检查即将调用的函数指针地址。它应该在 SDRAM 中有一个地址。
- 查看芯片是否有访问非法内存时跳转到的异常处理地址。一旦你在那里,输出一些调试数据
- 如果您的调试器允许,请在编写时在 someFunction() 上设置断点。这会在覆盖函数指针时捕获其他函数。
最近,我的嵌入式软件遇到了一个对我来说很奇怪的行为。
我得到: 运行一个32位AVR32控制器,从外部SDRAM启动程序,因为文件太大无法直接启动微控制器闪光灯。由于物理内存映射,内存区域分为:
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
此外,堆栈指针具有有效值,而发生异常的地址(获取指令的最后入口点)指向内存必杀技(例如0x496e6372,0x5...,0x6..附近的东西) ..).我想,这一定是手册中提到的 "First non-completed instruction"。但是,我的源代码中的那一行总是相同的:通过指针访问数据数组中的成员函数。
if(mSomeArray[i])
{
mSomeArray[i]->someFunction(); <-- Crash
}
问题是:添加或删除其他源代码会使事件消失并再次 return。
我想到了什么: 有东西在破坏我的记忆(映射)。这可能会导致什么样的错误?
- 缓冲区溢出?
- SDRAM 控制器可能已关闭,因此它丢失了一些数据。这不是不可能,而是不太可能
- 堆栈足够大,我已经用水印检查过了
- 数据总线速率和 AVR 时钟设置正确
如何解决这个问题:更断言?不幸的是我不能用 AVRStudio 调试它。任何人的提示或想法?还是我遗漏了一些明显的东西?
编辑:
用户提到的方法:
- 检查函数指针和数组条目的地址
- 覆盖堆栈数组
- 没有正确写入中断
- 未初始化指针
- 在崩溃情况下通过
i
检查数组访问 - 使用异常处理程序地址进行非法内存访问
- 使用
snprintf
代替sprintf
线程的后期附录:问题是旧软件模块中的数组访问错误(设置了错误的索引),这与我的模块无关。我偶然发现了这个,很奇怪它没有早点出现,我花了很长时间才找到代码行。我将唯一给出的答案标记为正确的解决方案。
谢谢大家的意见。
保重(您的软件;))
这里有一些想法:
- 检查 'i' 以确保它在数组范围内。
- 检查即将调用的函数指针地址。它应该在 SDRAM 中有一个地址。
- 查看芯片是否有访问非法内存时跳转到的异常处理地址。一旦你在那里,输出一些调试数据
- 如果您的调试器允许,请在编写时在 someFunction() 上设置断点。这会在覆盖函数指针时捕获其他函数。