打印

ARM 异常

[复制链接]
2031|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wangcunboy|  楼主 | 2009-11-27 09:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
arm_fan168| | 2009-11-27 13:34 | 只看该作者
发生哪种异常,相应的LR就会被更新,用ADDRESS代表导致异常的指令的地址,数据中止异常模式下,ADDRESS = LR - 8, 未定义指令异常模式下,若进入异常前处理器运行在thumb状态,则ADDRESS = LR - 2,若进入异常前处理器运行在ARM状态,则ADDRESS = LR - 4 。所以可以通过在异常入口处设置断点的办法,来得到导致异常发生的指令的地址。

使用特权

评论回复
板凳
wangcunboy|  楼主 | 2009-11-27 13:52 | 只看该作者
现在发生的是预取指令异常,这是我用仿真器看到的情况是LR中的地址是个很大数,超出了地址范围。

使用特权

评论回复
地板
arm_fan168| | 2009-11-27 14:24 | 只看该作者
预取指异常也是一样,只不过ADDRESS = LR - 4 。LR一定要看中止模式下的,LR_abt 。 方法就是这个,具体怎么解决,那得看你的了。

使用特权

评论回复
5
wangcunboy|  楼主 | 2009-11-27 14:51 | 只看该作者
怎么没发上去啊。再来。
现在观察到重启的原因是指令预取异常,也就是PC的地址超出了限定的地址范围。
查了好多吃,也没找到原因。

使用特权

评论回复
6
arm_fan168| | 2009-11-27 15:07 | 只看该作者
有可能是程序中某条B或者BL指令的操作数有错误,B和BL指令的跳转范围是+-32MB,如果跳到了一个根本没有物理存储器的地址,就会发生prefetch abort了。

使用特权

评论回复
7
wangcunboy|  楼主 | 2009-11-30 15:20 | 只看该作者
可能是野指针造成的吧,没找到原因。程序是C语言写的。
arm_fan168兄说的查看LR中的地址,但LR中的地址已经是异常的地址,我是想知道在发生异常的前一个地址是多少。
还是谢谢arm_fan168兄。

使用特权

评论回复
8
wangcunboy|  楼主 | 2009-11-30 16:37 | 只看该作者
论坛有问题,发上去怎么还看不见。
谢谢arm_fan168兄。
问题是发生异常时,LR的地址已经异常了,能知道发生异常前在哪个地址或者哪条语句就好了。

使用特权

评论回复
9
arm_fan168| | 2009-11-30 18:59 | 只看该作者
除了函数指针外,也可能是堆栈问题,堆栈溢出,跟全局变量区交叉了,程序在改写全局变量的时候把堆栈里的内容也改变了,调用子程序返回的时候,就有可能出现这个问题。

使用特权

评论回复
10
wangcunboy|  楼主 | 2009-12-1 15:51 | 只看该作者
我把该任务的堆栈已经设为最大了,还是会出现那样的问题。
系统是UCOS+UCGUI.

使用特权

评论回复
11
ma1986| | 2009-12-1 17:56 | 只看该作者
数组越界了,检查下你定义的数组大小。。。我感觉是因为这个~~
另外,你看lr看的是什么模式下的?svc usr???这些都具有一定的参考价值。

使用特权

评论回复
12
wangcunboy|  楼主 | 2009-12-2 13:44 | 只看该作者
TO netjob兄:程序肯定是有问题,“嵌套或中断搞的鬼”请明言。
TO ma1986:数组越界和野指针基本被排除,用的是ARM7的片子。

使用特权

评论回复
13
logers| | 2010-1-11 14:27 | 只看该作者
精华帖
我也遇到过几次,我的程序发现是中断问题。

使用特权

评论回复
14
xinzha| | 2010-1-11 14:41 | 只看该作者
我追查过的预取指错多数是由于变量初始化或者堆栈混乱造成的,建议楼主可以尝试堆栈回滚。
取数据中止就比较广泛了,凡是读写了地址译码器不认识的地址都会造成问题

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

49

帖子

0

粉丝