打印

程序进入FaultISR最新调试记录,请大家指点

[复制链接]
6988|30
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zxb1717|  楼主 | 2012-2-17 12:08 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
沙发
zxb1717|  楼主 | 2012-2-17 12:26 | 只看该作者
有位朋友说PC指针保存着程序跳转前那一条语句的地址,但是如上面两幅图所示,第一幅图中
PC =0x0000CCDA,它所指向的语句已经在FaultISR里面了,是不是我哪里搞错了,请大家指点一下

使用特权

评论回复
板凳
zxb1717|  楼主 | 2012-2-17 14:37 | 只看该作者
自己顶一下,求大家帮忙看一下

使用特权

评论回复
地板
icecut| | 2012-2-17 15:29 | 只看该作者
lr应该是跳进来前的地址...明显飞了

使用特权

评论回复
5
zxb1717|  楼主 | 2012-2-17 15:41 | 只看该作者
回复6楼,我知道跑飞了,所以想知道跑飞之前的那一句语句在哪,请大家继续指点。

使用特权

评论回复
6
zxb1717|  楼主 | 2012-2-18 10:16 | 只看该作者
类似遇到过相同情况的朋友给点意见,谢谢啦

使用特权

评论回复
7
suse-lj| | 2012-2-18 11:41 | 只看该作者
我用STM32也遇到过此等问题。结果我修改一下编译器的优化级别就搞定了。但究竟去原因我没有找出来

使用特权

评论回复
8
zxb1717|  楼主 | 2012-2-18 12:27 | 只看该作者
7楼的兄弟,能说说你怎么改的编译器优化级别啊,那我如果不是在线运行的,是烧进去运行的,还跟编译器有关么

使用特权

评论回复
9
zxb1717|  楼主 | 2012-2-18 12:37 | 只看该作者
问了一个弱弱的问题,以上问题自解,就是不知道怎么设置编译器优化级别

使用特权

评论回复
10
zxb1717|  楼主 | 2012-2-18 12:44 | 只看该作者
查看IAR使用手册后只到怎么设置编译器优化级别了,我设置的是LOW级别,再低就是NONE了,不知道7楼的兄弟是把优化级别提高还是降低,希望能告知一下,希望大家多给点意见。

使用特权

评论回复
11
icecut| | 2012-2-18 12:57 | 只看该作者
跑飞是没法追踪的...你只能看看堆栈里面有没有你想要的callstack

使用特权

评论回复
12
zxb1717|  楼主 | 2012-2-18 18:56 | 只看该作者
跑飞是没法追踪的...你只能看看堆栈里面有没有你想要的callstack
icecut 发表于 2012-2-18 12:57


我的程序都是在固定的操作以后才进入FaultISR()的,不是随机性跑飞的,另外在什么地方能看到
callstack?

使用特权

评论回复
13
zxb1717|  楼主 | 2012-2-18 19:00 | 只看该作者
另外补充一下,进入FaultISR()的那个操作一般都是在操作几十次以后才会使程序进入FaultISR(),所以奇怪为什么会这样,如果是没有使能要访问的外设,那应该每次都会进入啊,为什么要几十次操作以后才发生呢?有一次利用LR=SP+20,追踪到LR是落在定时器中断函数里面,是不是一定和定时器中断函数有关呢?请大家给点意见,谢谢啦

使用特权

评论回复
14
zxb1717|  楼主 | 2012-2-19 10:46 | 只看该作者
我看别人发的帖子说程序生成的map会有以下信息,主要是有关于CSTACK的数据,我用的是IAR6.1版本的,生成的MAP没有以下信息,那我该怎么找出以下相关信息呢,请IAR熟手指点一下,谢谢啦。
SEGMENT              SPACE    START ADDRESS   END ADDRESS     SIZE  TYPE  ALIGN
=======              =====    =============   ===========     ====  ====  =====
INTVEC               CODE          00000000 - 00000027          28   com    1
?FILL1               CODE          00000028 - 00000053          2C   rel    0
DIFUNCT              CODE          00000054 - 00000055           2   rel    0
CODE                 CODE          00000056 - 00000715         6C0   rel    1
INITTAB              CODE          00000716 - 00000721           C   rel    0
NEAR_ID              CODE          00000722 - 0000072D           C   rel    0
ABSOLUTE             DATA          0000003A - 0000003B           2   rel    0
                     DATA          00000052 - 00000053           2  
                     DATA          00000059 - 00000059           1  
                     DATA          0000005F - 0000005F           1  
CSTACK               DATA          00000060 - 000000C3          64   dse    0
NEAR_HEAP            DATA          000000C4 - 000000F5          32   dse    0
RSTACK               DATA          000000F6 - 00000159          64   dse    0
NEAR_I               DATA          0000015A - 00000165           C   rel    0
NEAR_Z               DATA          00000166 - 00000195          30   rel    0
EEPROM_I             XDATA         00000000 - 00000000           1   rel    0

使用特权

评论回复
15
李富贵| | 2012-2-19 11:19 | 只看该作者
16
zxb1717|  楼主 | 2012-2-19 11:43 | 只看该作者
谢谢15楼李大侠的详解,李大侠的方法主要是查看lr的值以及FAULT状态寄存器的值吧,其中lr的值我看过,能找到相关的函数,就是定时器1的中断函数,至于会在哪一句不一定,有点随机,所以现在不好定位,光从代码看没看出问题。关于FAULT状态寄存器的值我还没看过,这个是不是在调试的时候打开memory窗口,输入寄存器地址的值比如0xE000ED28就可以看到的吧,不一定要写以下代码的吧,我的理解对么?
printf ("BFAR = %x\n", (*((volatile unsigned long *)(0xE000ED38))));   

printf ("CFSR = %x\n", (*((volatile unsigned long *)(0xE000ED28))));   

printf ("HFSR = %x\n", (*((volatile unsigned long *)(0xE000ED2C))));   

printf ("DFSR = %x\n", (*((volatile unsigned long *)(0xE000ED30))));   

printf ("AFSR = %x\n", (*((volatile unsigned long *)(0xE000ED3C))));

使用特权

评论回复
17
zxb1717|  楼主 | 2012-2-19 14:29 | 只看该作者
请教icecut,能否详细指点一下“堆栈里面有没有你想要的callstack”怎么操作,第一次用IAR不熟,网上的IAR使用指南是简要版本的,只有25页,没看到这方面的介绍,还望再指明一下,谢谢!

使用特权

评论回复
18
李富贵| | 2012-2-19 16:53 | 只看该作者
根据你的现象应该是内存访问越界堆栈溢出一类的毛病。

使用特权

评论回复
19
zxb1717|  楼主 | 2012-2-19 17:07 | 只看该作者
再次感谢李大侠的指点,我现在初步也是这么怀疑的,所以我现在的问题是:第一,我怎么看到我的程序有关STACK的信息,我之前说过我的程序生成后的MAP没有相关STACK的信息;第二,如果我的程序堆栈溢出,那怎么修改IAR的stack设置。我的IAR是6.1版本,希望大家针对性的给点意见,谢谢李大侠,谢谢大家啦!

使用特权

评论回复
20
李富贵| | 2012-2-19 17:25 | 只看该作者
heap和stack都在icf文件里面设定,但是我怀疑stack设置没有用,因为未用RAM都是分配给CSTACK的,可能是链接的时候剩余空间低于icf文件规定值会出一个警告。

使用特权

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

本版积分规则

31

主题

231

帖子

1

粉丝