其实很多人刚开始都会觉得数据异常很讨厌,到后来真正了解之后,才发现这个东西真不错,能有效的帮助我们查找到问题所在。如果没有这个东西,很多问题是很难被发现的。 一般会出现此现象的原因: 1.堆栈的指针不合理(C编译器无法侦测到。),随着SP的延伸,可能会到临界地区,发生不正确的物理地址的访问。 2.在C中使用volatile的物理地址访问,有可能出现非法的数据区域访问。 3.特别是在工业控制等场合(掉电重起后,数据要求不更改,做到数据保护),系统启动过程中,屏蔽掉__main的初始化变量功能,很多公共变量(如定义成unsigned short x=0x8888,或指向某些结构的指针).在启动后没有初始化代码为其做初始化。所以容易产生随机地址访问,出现 data abort。此情况下,最好在用户程序一开始就做好全局变量的初始化工作。 解决方案: 应有一些ARM汇编基础,在进入数据异常的时候,通过查找LR地址,ADS下使用setpc跳到LR内的地址(keil下,则是show code at Address),此处的代码(可能是一个小小范围,因为流水线的问题)就是引起错误的指令。查看此代码对哪些变量进行了访问(如果有堆栈操作,则设置断点,程序执行到此处后。查看SP指针是否合法) |