最近,我在嵌入式软件中遇到了一种--对我来说--奇怪的行为。
我得到了什么:运行32位AVR32控制器,从外部SDRAM启动程序,因为文件大小太大,无法直接从微控制器闪存启动。由于物理内存映射,内存区域被划分为:
堆栈(从0x1000开始,长度为0xF 000)(< 0x1000受MPU保护) EBI SDRAM (从0xD0000000开始,长度为0x00400000)。
发生了什么:不幸的是,我得到了一个异常,这是不可复制的。查看给定的堆栈跟踪,会发生以下不规则事件:
名称:总线错误数据获取-事件源:数据总线存储的返回地址:第一条未完成的指令
此外,堆栈指针有一个有效值,而发生异常的地址(获取指令的最后一个入口点)指向内存涅盘(例如0x496e6372,大约0x5.,0x6.)。我想,这一定是“第一个未完成的指示”,手册上正在讨论。但是,我的源代码中的行总是相同的:通过指针从数据数组访问成员函数。
if(mSomeArray[i])
{
mSomeArray[i]->someFunction(); <-- Crash
}问题是:添加或删除其他源代码会使事件消失并再次返回。
我所想的:某些东西正在腐蚀我的记忆(映射)。这种错误有可能是什么类型的?
如何解决这一问题:更断言?不幸的是,我不能用AVRStudio来调试它。有什么暗示或想法吗?还是我漏掉了什么明显的东西?
编辑:
提到了来自用户的方法:
i访问数组snprintf而不是sprintf线程的后期附录:这个问题是旧软件模块中错误的数组访问(设置了错误的索引),这与我的模块无关。我偶然发现了这个,这是一种好奇,因为它没有早些时候出现,我花了很长时间才找到代码行。我把唯一给出的答案标记为正确的解。
谢谢大家的意见。
小心(你的软件;)
发布于 2015-09-23 18:15:57
以下是一些想法:
https://stackoverflow.com/questions/32712816
复制相似问题