用IAR调试工STM32F101RB8,遇问题请高手指点!

xwell   2010-5-7 11:40 楼主
                                 程序大部分都正常,就是有一个函数不对,程序只要执行到那儿就进入HardFaultException() 中断死住,不知是什么原因?

回复评论 (18)

                                 嗬嗬,原因应该是那个函数不对。
点赞  2010-5-7 12:00
                                 没发现啊,函数不大,没什么操作,都是数值计算类的,开始我以为是堆或栈设置不对,改了也不好用。
点赞  2010-5-7 13:08
                                 这个错误是什么意思?什么情况下会发生,我看了下资料没理解多少,好像是说硬件类的错误。
点赞  2010-5-7 13:08


进入HardFaultException() 后,如果再度产生硬错误,会造成芯片死锁,只能用复位来消除。
通常应该避免产生FaultException,如果产生了,比较简单的方法就是复位,呵呵。

如果调试时发生FaultException错误,大部分原因是由于打开了DMA导致的。掉电清除会有效。
点赞  2010-5-7 13:29
                                 你还是看下汇编吧,看看具体执行到哪句指令导致了HardFault,一般知道哪句指令就很好找原因了。
点赞  2010-5-7 13:41
找到出问题点,才是根本
产生的异常的原因太多了,比如memory访问到无效空间,比如寄存器读写异常

出现这个中断是好事,它明确告诉了我们隐藏的问题。
我调试的时候喜欢在中断服务程序中放入LCM显示“我是超级错误,专干坏事的”,Release出去的时候改为“内部错误,请联系方案提供商”。

好了,“授人以鱼,不如授人以渔”,我就说下如何找到产生这个bug的根源。

用仿真器,想方设法故意让程序进入此异常中断(让客户提供尽可能多的信息是非常有帮助的)。
然后停止运行,打开堆栈窗口,找上一级一级的找,问题点就暴露出来了,一般不会超过5分钟。
如果你的仿真器有trace功能,那更强大了,各级堆栈的详细信息一览无余,就更easy了。
点赞  2010-5-7 14:28
香斑所说的“某个函数”,就在堆栈列表的某个函数中。
不要随便用看门狗Reset回来就完事了,男人应该负责任不是,工程师男人也应该对自己的PRJ负责任。
点赞  2010-5-7 14:31
                                 好像是RAM溢出,在此请教我定义的常量数组用如下方法以:const u8  tary[100];,这个应该是在ROM空间的,但为什么还要占相同的RAM空间?是不是这种写法不对?
点赞  2010-5-8 08:56
我把定义的变量数组缩一下问题就解决了。
现在了现另外一个疑问:我用的是101RB,应该是16K的SRAM,而我的.map文件显示
3954  RO data memory
3707  RW data memory
两个数加一起还不到一半,怎么会有问题?即使调试代码占些RAM也不至于占8K吧?
点赞  2010-5-11 11:31
                                 数组定义过大怎么会提示这样的错误呢
点赞  2010-5-11 21:00
                                 不知会不会是我的片子有问题,怕是测试片。
点赞  2010-5-24 14:27
不知会不会是我的片子有问题,怕是测试片。
1)通常你拿不到测试片;2)即使是测试片也不可能出现这种低级的问题。

一般碰到这种问题的解决办法都是在HardFault中设置断点,然后当程序碰到断点停下后,通过堆栈倒查找出是哪条指令出的问题。
点赞  2010-5-24 14:41
                                 版主,堆栈里查指令怎么查?那个都是16进制数吧。
点赞  2010-5-24 17:34
进入HardFault时,堆栈中有产生问题的那条指令的后一条指令所在的地址,这是由CPU保存的返回地址,知道了后一条指令在哪里,就找到了产生问题的那条指令,找到了产生问题的那条指令,就可以知道对应的那一行C程序......,这样倒查就可以找出问题的出处了。
点赞  2010-5-24 17:38
                                 call stack中显示的三条指令和当前是什么关系?
点赞  2010-5-24 18:18
                                 有哪位能用代码举一个例子 让我们大家都能切身的了解到产生中断异常改怎么处理,怎么找到问题所在。对于我们很多的初学者,碰到这些问题很多时候无从下手,甚至会丢到一边干脆不管了! 这样很难学到精华所在。假如那个能给大家一个示范,那真是感激不尽了。
点赞  2010-5-24 21:05
CPU处理异常中断的方法与普通中断,当产生异常中断时CPU需要把中断的返回地址保存到堆栈中。

知道这一点之后,按照7楼和15楼介绍的方法做即可。
点赞  2010-5-25 08:47
                                 mark
点赞  2010-12-22 11:25
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复