5894|18

82

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

用IAR调试工STM32F101RB8,遇问题请高手指点! [复制链接]

                                 程序大部分都正常,就是有一个函数不对,程序只要执行到那儿就进入HardFaultException() 中断死住,不知是什么原因?
此帖出自stm32/stm8论坛

最新回复

                                 mark  详情 回复 发表于 2010-12-22 11:25
点赞 关注
 

回复
举报

83

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
                                 嗬嗬,原因应该是那个函数不对。
此帖出自stm32/stm8论坛
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
                                 没发现啊,函数不大,没什么操作,都是数值计算类的,开始我以为是堆或栈设置不对,改了也不好用。
此帖出自stm32/stm8论坛
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

4
 
                                 这个错误是什么意思?什么情况下会发生,我看了下资料没理解多少,好像是说硬件类的错误。
此帖出自stm32/stm8论坛
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

5
 


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

如果调试时发生FaultException错误,大部分原因是由于打开了DMA导致的。掉电清除会有效。
此帖出自stm32/stm8论坛
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

6
 
                                 你还是看下汇编吧,看看具体执行到哪句指令导致了HardFault,一般知道哪句指令就很好找原因了。
此帖出自stm32/stm8论坛
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

7
 
找到出问题点,才是根本
产生的异常的原因太多了,比如memory访问到无效空间,比如寄存器读写异常

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

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

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

回复

64

帖子

0

TA的资源

一粒金砂(初级)

8
 
香斑所说的“某个函数”,就在堆栈列表的某个函数中。
不要随便用看门狗Reset回来就完事了,男人应该负责任不是,工程师男人也应该对自己的PRJ负责任。
此帖出自stm32/stm8论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

9
 
                                 好像是RAM溢出,在此请教我定义的常量数组用如下方法以:const u8  tary[100];,这个应该是在ROM空间的,但为什么还要占相同的RAM空间?是不是这种写法不对?
此帖出自stm32/stm8论坛
 
 
 

回复

19

帖子

0

TA的资源

一粒金砂(初级)

10
 
我把定义的变量数组缩一下问题就解决了。
现在了现另外一个疑问:我用的是101RB,应该是16K的SRAM,而我的.map文件显示
3954  RO data memory
3707  RW data memory
两个数加一起还不到一半,怎么会有问题?即使调试代码占些RAM也不至于占8K吧?
此帖出自stm32/stm8论坛
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

11
 
                                 数组定义过大怎么会提示这样的错误呢
此帖出自stm32/stm8论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

12
 
                                 不知会不会是我的片子有问题,怕是测试片。
此帖出自stm32/stm8论坛
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

13
 
不知会不会是我的片子有问题,怕是测试片。
1)通常你拿不到测试片;2)即使是测试片也不可能出现这种低级的问题。

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

回复

63

帖子

0

TA的资源

一粒金砂(初级)

14
 
                                 版主,堆栈里查指令怎么查?那个都是16进制数吧。
此帖出自stm32/stm8论坛
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

15
 
进入HardFault时,堆栈中有产生问题的那条指令的后一条指令所在的地址,这是由CPU保存的返回地址,知道了后一条指令在哪里,就找到了产生问题的那条指令,找到了产生问题的那条指令,就可以知道对应的那一行C程序......,这样倒查就可以找出问题的出处了。
此帖出自stm32/stm8论坛
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

16
 
                                 call stack中显示的三条指令和当前是什么关系?
此帖出自stm32/stm8论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

17
 
                                 有哪位能用代码举一个例子 让我们大家都能切身的了解到产生中断异常改怎么处理,怎么找到问题所在。对于我们很多的初学者,碰到这些问题很多时候无从下手,甚至会丢到一边干脆不管了! 这样很难学到精华所在。假如那个能给大家一个示范,那真是感激不尽了。
此帖出自stm32/stm8论坛
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

18
 
CPU处理异常中断的方法与普通中断,当产生异常中断时CPU需要把中断的返回地址保存到堆栈中。

知道这一点之后,按照7楼和15楼介绍的方法做即可。
此帖出自stm32/stm8论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

19
 
                                 mark
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表