本人最近一直着手于嵌入式网络这一块,先开始在做LWIP+UCOS的时候就被这个dataabort搞得焦头烂额,后来实在是无法继续。终于在网上找到了一个基于ARM7的uip给力源码,所以就换成uip裸奔了,但是有一阵子任然是dataabort在作祟,所以有必要系统地分析一下dataabort的解决方法。
经常你会在程序debug的时候,你会发现跳转到这里“Dabt_Handler BDabt_Handler”,当然这是个死循环,程序crash掉,如图下。
这个时候你就要寻找到发生dataabort的地方。下图是正常状态下的寄存器窗口。
User/System为粗体,一旦dataabort,那么Abort为粗体。
这个时候找出R14(LR)的值,如果LR=0x000027b5,那么LR-8=0x0000 27ad。于是查看汇编窗口就能找到这个程序所在的地方。
由于“Dabt_Handler BDabt_Handler”是个死循环,所以你如果需要程序retry theinstuction,你可以在启动文件中改成如下代码。
直接把R14减去8,再将值赋给PC指针,这样就OK啦。至于发生dataabort的深层次原因,那就因程序而异了。比如在玩UCOS的时候,OSStart()还没有运行,就直接使用OSTimeDly(),结果肯定就会发生dataabort。又比如,BYTEa,b,c;b=0;c=a/b;,显然也会dataabort。祝大家好运,我会努力学习的!