打印

程序进入FaultISR最后BFAR=0xE3000029

[复制链接]
6312|44
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zxb1717|  楼主 | 2012-2-21 17:19 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
沙发
zxb1717|  楼主 | 2012-2-21 17:22 | 只看该作者
把图片补上

使用特权

评论回复
板凳
zxb1717|  楼主 | 2012-2-21 17:29 | 只看该作者
如果我理解没错的话,BFAR寄存器地址为0xE000ED38,那么上图中对应的值应该为E3000029,不知道对不对?

使用特权

评论回复
地板
zxb1717|  楼主 | 2012-2-21 19:39 | 只看该作者
哪位大侠能指点一下,我理解的对不对,谢谢啊!

使用特权

评论回复
5
李富贵| | 2012-2-21 20:43 | 只看该作者
0xe3000029不是肇事指令地址,而是肇事指令想要存取这个错误的地址。

使用特权

评论回复
6
zxb1717|  楼主 | 2012-2-21 21:27 | 只看该作者
0xe3000029不是肇事指令地址,而是肇事指令想要存取这个错误的地址。
李富贵 发表于 2012-2-21 20:43

还是李大侠再次出手帮忙解答,万分感谢真的!那我都已查到这个地步了,按照M3权威指南的描述应该可以精确的定位造势指令的地址啊,那我还差什么呢?

使用特权

评论回复
7
zxb1717|  楼主 | 2012-2-21 21:28 | 只看该作者
那BFAR寄存器当中的值有什么用吗?

使用特权

评论回复
8
李富贵| | 2012-2-21 21:34 | 只看该作者
你每次进入fault_isr的指令地址都是一个吗?每次的bfar内容都一样嘛?

进fault_isr的事情遇到过几次,但都是从C的层次上解决的(从上次正常的时候到现在不正常添加了什么代码?),从来没像你这样研究的这么细。

使用特权

评论回复
9
zxb1717|  楼主 | 2012-2-21 22:20 | 只看该作者
李大侠,我也是没办法,第一次接收以前工程师留下的难题,他离职之前调了好几个月也没发现出问题,也是第一次用M3,第一次用IAR,第一次碰到这种进入fault_isr的情况,所以只能上网求助。我现在这个程序就是在执行一个刷卡输密码后要去执行指定的函数时程序进入fault_isr,不过这里有个奇怪的现象就是:很有有程序烧进去后一运行就进入fault_isr,都是要刷卡输密码操作几十次以后才会出现,就像今天一天才出现两次,出现时,SP都等于0x20002874;这样我就得出LR为0x20002888,然后根据LR在汇编窗口找到对应的地址0x00006bad,这样就定位到一个函数中的其中一个语句,这个语句非常简单,就是以下语句的if汇编语句,所以真的不知道错哪了,我忘了记第一次BFAR的值了,这个我明天可以再试一下。
.............
if(key != 10)        
    MenuDis(&TIP4);

...........................................

使用特权

评论回复
10
zxb1717|  楼主 | 2012-2-22 19:23 | 只看该作者
今天没出现死机,明天继续跟踪,随时上传过程

使用特权

评论回复
11
zxb1717|  楼主 | 2012-2-23 10:08 | 只看该作者
8# 李富贵
李大侠,经调试发现我每次进入fault_isr的地址指令都是同一个,但是bfar值不是每次都一样,请问李大侠怎么看?

使用特权

评论回复
12
zxb1717|  楼主 | 2012-2-23 10:22 | 只看该作者
还有一个疑问就是,为什么出错时PC保存的值不是出错前的那个地址,而已经是在FaultISR()函数里面了呢?高手们有什么看法吗?

使用特权

评论回复
13
icecut| | 2012-2-23 11:04 | 只看该作者
pc是当前地址....这是亘古不变的.lr是call当前函数的返回地址.这是函数调用规定的..但是对以前的lr是要压栈保持的...m3支持debug.建议你分块调试....

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
zxb1717 + 2 赞一个!
14
zxb1717|  楼主 | 2012-2-23 11:17 | 只看该作者
13楼的这位兄弟,我第一次用M3,不知道你说的分块调试该怎么操作。

使用特权

评论回复
15
zxb1717|  楼主 | 2012-2-23 11:18 | 只看该作者
13# icecut
你的意思是不是将程序分块调试,还是其他什么意思呢?

使用特权

评论回复
16
icecut| | 2012-2-23 13:27 | 只看该作者
15# zxb1717
是的....一般都是程序写错了.你如果不看他的设计.就直接从底层这么搞.太累啊....

至少挂上仿真器跑.死了还能找找call stack....

使用特权

评论回复
17
zxb1717|  楼主 | 2012-2-23 13:45 | 只看该作者
谢谢icecut!是挂着仿真器的,现在就是只调一个功能模块,调的是CAN,关键是我的现在的这个程序不是每次都会出现faultISR(),有时候操作了上百次才有可能出现一次,不过出现的地址都是同一个,但是那个语句就是简单的一个if语句,从代码上看不出什么问题

使用特权

评论回复
18
wangc111| | 2012-2-23 13:45 | 只看该作者
学习下

使用特权

评论回复
19
李富贵| | 2012-2-23 14:42 | 只看该作者
本帖最后由 李富贵 于 2012-2-23 14:45 编辑

不会是编译器bug吧?你可以试试降低优化等级,或者用MDK或者GCC试试。

说实话,MDK编译器发疯我见过,IAR一直没出过问题,不过不敢保证永远没问题。

使用特权

评论回复
20
zxb1717|  楼主 | 2012-2-23 14:54 | 只看该作者
李大侠,现在的优化等级是LOW,再低就是NONE了,手头没有MDK和GCC啊

使用特权

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

本版积分规则

31

主题

231

帖子

1

粉丝