首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AVR32异常:总线数据错误

AVR32异常:总线数据错误
EN

Stack Overflow用户
提问于 2015-09-22 09:03:12
回答 1查看 819关注 0票数 3

最近,我在嵌入式软件中遇到了一种--对我来说--奇怪的行为。

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

堆栈(从0x1000开始,长度为0xF 000)(< 0x1000受MPU保护) EBI SDRAM (从0xD0000000开始,长度为0x00400000)。

发生了什么:不幸的是,我得到了一个异常,这是不可复制的。查看给定的堆栈跟踪,会发生以下不规则事件:

名称:总线错误数据获取-事件源:数据总线存储的返回地址:第一条未完成的指令

此外,堆栈指针有一个有效值,而发生异常的地址(获取指令的最后一个入口点)指向内存涅盘(例如0x496e6372,大约0x5.,0x6.)。我想,这一定是“第一个未完成的指示”,手册上正在讨论。但是,我的源代码中的行总是相同的:通过指针从数据数组访问成员函数。

代码语言:javascript
复制
      if(mSomeArray[i])
      {
         mSomeArray[i]->someFunction(); <-- Crash
      }

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

我所想的:某些东西正在腐蚀我的记忆(映射)。这种错误有可能是什么类型的?

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

如何解决这一问题:更断言?不幸的是,我不能用AVRStudio来调试它。有什么暗示或想法吗?还是我漏掉了什么明显的东西?

编辑:

提到了来自用户的方法:

  • 检查函数指针和数组条目的地址
  • 堆栈数组的覆盖
  • 不恰当的书面中断
  • 未初始化指针
  • 在崩溃情况下检查是否通过i访问数组
  • 使用异常处理程序地址进行非法内存访问
  • 使用snprintf而不是sprintf

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

谢谢大家的意见。

小心(你的软件;)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-23 18:15:57

以下是一些想法:

  1. 检查“i”以确保它在数组范围内。
  2. 检查即将调用的函数指针的地址。它应该在SDRAM中有一个地址。
  3. 查看芯片在访问非法内存时是否具有异常处理程序地址。一旦您在那里,输出一些调试数据。
  4. 如果您的调试器允许,则在编写someFunction()时在它上设置一个断点。这将在覆盖函数指针时捕获其他函数。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32712816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档