21ic电子技术开发论坛 单片机与嵌入式系统 ST MCU 用IAR调试工STM32F101RB8,遇问题请高手指点!
发新帖我要提问
返回列表
打印

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

[复制链接]
2040|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mcuatmel|  楼主 | 2010-5-7 11:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序大部分都正常,就是有一个函数不对,程序只要执行到那儿就进入HardFaultException() 中断死住,不知是什么原因?
沙发
香水城| | 2010-5-7 12:00 | 只看该作者
嗬嗬,原因应该是那个函数不对。

使用特权

评论回复
板凳
mcuatmel|  楼主 | 2010-5-7 13:08 | 只看该作者
没发现啊,函数不大,没什么操作,都是数值计算类的,开始我以为是堆或栈设置不对,改了也不好用。

使用特权

评论回复
地板
mcuatmel|  楼主 | 2010-5-7 13:08 | 只看该作者
这个错误是什么意思?什么情况下会发生,我看了下资料没理解多少,好像是说硬件类的错误。

使用特权

评论回复
5
mcuisp| | 2010-5-7 13:29 | 只看该作者
本帖最后由 mcuisp 于 2010-5-7 13:30 编辑

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

如果调试时发生FaultException错误,大部分原因是由于打开了DMA导致的。掉电清除会有效。

使用特权

评论回复
6
vigia| | 2010-5-7 13:41 | 只看该作者
你还是看下汇编吧,看看具体执行到哪句指令导致了HardFault,一般知道哪句指令就很好找原因了。

使用特权

评论回复
7
McuPlayer| | 2010-5-7 14:28 | 只看该作者
找到出问题点,才是根本
产生的异常的原因太多了,比如memory访问到无效空间,比如寄存器读写异常

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

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

用仿真器,想方设法故意让程序进入此异常中断(让客户提供尽可能多的信息是非常有帮助的)。
然后停止运行,打开堆栈窗口,找上一级一级的找,问题点就暴露出来了,一般不会超过5分钟。
如果你的仿真器有trace功能,那更强大了,各级堆栈的详细信息一览无余,就更easy了。

使用特权

评论回复
8
McuPlayer| | 2010-5-7 14:31 | 只看该作者
香斑所说的“某个函数”,就在堆栈列表的某个函数中。
不要随便用看门狗Reset回来就完事了,男人应该负责任不是,工程师男人也应该对自己的PRJ负责任。

使用特权

评论回复
9
mcuatmel|  楼主 | 2010-5-8 08:56 | 只看该作者
好像是RAM溢出,在此请教我定义的常量数组用如下方法以:const u8  tary[100];,这个应该是在ROM空间的,但为什么还要占相同的RAM空间?是不是这种写法不对?

使用特权

评论回复
10
mcuatmel|  楼主 | 2010-5-11 11:31 | 只看该作者
我把定义的变量数组缩一下问题就解决了。
现在了现另外一个疑问:我用的是101RB,应该是16K的SRAM,而我的.map文件显示
3954  RO data memory
3707  RW data memory
两个数加一起还不到一半,怎么会有问题?即使调试代码占些RAM也不至于占8K吧?

使用特权

评论回复
11
pkat| | 2010-5-11 21:00 | 只看该作者
数组定义过大怎么会提示这样的错误呢

使用特权

评论回复
12
mcuatmel|  楼主 | 2010-5-24 14:27 | 只看该作者
不知会不会是我的片子有问题,怕是测试片。

使用特权

评论回复
13
香水城| | 2010-5-24 14:41 | 只看该作者
不知会不会是我的片子有问题,怕是测试片。
mcuatmel 发表于 2010-5-24 14:27


1)通常你拿不到测试片;2)即使是测试片也不可能出现这种低级的问题。

一般碰到这种问题的解决办法都是在HardFault中设置断点,然后当程序碰到断点停下后,通过堆栈倒查找出是哪条指令出的问题。

使用特权

评论回复
14
mcuatmel|  楼主 | 2010-5-24 17:34 | 只看该作者
香主,堆栈里查指令怎么查?那个都是16进制数吧。

使用特权

评论回复
15
香水城| | 2010-5-24 17:38 | 只看该作者
进入HardFault时,堆栈中有产生问题的那条指令的后一条指令所在的地址,这是由CPU保存的返回地址,知道了后一条指令在哪里,就找到了产生问题的那条指令,找到了产生问题的那条指令,就可以知道对应的那一行C程序......,这样倒查就可以找出问题的出处了。

使用特权

评论回复
16
mcuatmel|  楼主 | 2010-5-24 18:18 | 只看该作者
call stack中显示的三条指令和当前是什么关系?

使用特权

评论回复
17
hqqymh| | 2010-5-24 21:05 | 只看该作者
有哪位能用代码举一个例子 让我们大家都能切身的了解到产生中断异常改怎么处理,怎么找到问题所在。对于我们很多的初学者,碰到这些问题很多时候无从下手,甚至会丢到一边干脆不管了! 这样很难学到精华所在。假如那个能给大家一个示范,那真是感激不尽了。

使用特权

评论回复
18
香水城| | 2010-5-25 08:47 | 只看该作者
CPU处理异常中断的方法与普通中断,当产生异常中断时CPU需要把中断的返回地址保存到堆栈中。

知道这一点之后,按照7楼和15楼介绍的方法做即可。

使用特权

评论回复
19
xiepengchenghn| | 2010-12-22 11:25 | 只看该作者
mark

使用特权

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

本版积分规则

512

主题

1455

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部