打印
[STM32F1]

深入Cortex-M3内核的问题,程序跑飞了HardFault_Handler

[复制链接]
16763|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
看我吴钩|  楼主 | 2014-1-8 09:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在调试can通信过程产生的问题,我是用定时器中断每隔一定时间,就让单片机(一个节点)发送一帧数据给另一个节点。这些都不是关键。关键是在我没有使用定时器TIM4的时候(此时,已经打开了串口,can接收中断),一切都ok。在初始化TIM4后,打开了TIM4_IRQHandler定时器中断,问题出现了在进入定时器中断 1 到 2次后,pc跳入了STM32的启动文件里,下面这个地方:(且R14(LR)寄存器的值为一个莫名的地址0xfffffff1)
HardFault_Handler\
                PROC
                EXPORT  HardFault_Handler          [WEAK]
                B       .
                ENDP
这里先排除掉几个方面,TIM4_IRQHandler是定义里的有入口地址,STM32F103RET6启动文件配置正确。
这两天简单研究了一下M3核的汇编指令,试着解决问题。对于跳入HardFault_Handler的问题,网上的答案,只隔靴挠痒,没有解决实质问题,说是什么,指针指向系统不允许的地方、数据数组溢出了,硬件错误,等等。且不说是不是这些原因。我也单步调试了,关键是怎么知道数组是否越界?怎么找硬件出错的地方。或者写个汇编代码,把问题出错的地方打印出来。捣腾3天了……只好求助于各位大侠了!先谢谢
沙发
ilovezeno| | 2014-1-8 09:18 | 只看该作者
你用英文在google上搜搜,三秒钟出方法,简单方便。。。。你用中文?那你继续找吧。。。。
Hardfault会自动压栈pc的,到sp指针位置倒过来数就找到了。。。。。

使用特权

评论回复
板凳
ahuzjh| | 2014-1-8 09:57 | 只看该作者
个人建议可以看看出现hardfault的原因,然后根据出现的原因进行排除。用指针需谨慎,特别是数组指针混用。

使用特权

评论回复
地板
jjjkkk00| | 2014-1-8 12:22 | 只看该作者
本帖最后由 jjjkkk00 于 2014-1-8 12:23 编辑

看这个链接“ STM32出现HardFault_Handler故障的原因及处理方法整理”
http://blog.csdn.net/hitxiaya/article/details/7452579

使用特权

评论回复
5
看我吴钩|  楼主 | 2014-1-11 14:01 | 只看该作者
谢谢!各位大牛的指点!主要是自己对M3内核不熟悉造成的问题。于是,我仔细参考《CM3权威指南》查看了M3内核有关异常处理的相关章节,第七**章,我使能了总线fault,存储fault和用法fault中断,使他们不能上访成硬fault。发现出错时跳入了存储fault(MemManage fault 状态寄存器(MFSR地址:0xE000_ED28)的最低位被置1,也就是取指访问违例),按照第9章,异常中断压栈,出栈顺序,找到了出错的位置(语句)。至此,问题应该解决了。可是,我却束手无策了……怎么消除这个fault呢???也就是说问题找到了,怎么解决呢??因为我的错误发生在进入can接收中断里面和我也用了数组,取指访问违例?我仔细检查过了数组没有越界。指针指向了不该指的地方,导致违例,可是机器指令码,是由编译器决定的怎么改才能不让他产生错误代码??

使用特权

评论回复
6
看我吴钩|  楼主 | 2014-1-11 14:03 | 只看该作者
ilovezeno 发表于 2014-1-8 09:18
你用英文在google上搜搜,三秒钟出方法,简单方便。。。。你用中文?那你继续找吧。。。。
Hardfault会自动 ...

谢谢!确实是!

使用特权

评论回复
7
看我吴钩|  楼主 | 2014-1-11 14:03 | 只看该作者
ahuzjh 发表于 2014-1-8 09:57
个人建议可以看看出现hardfault的原因,然后根据出现的原因进行排除。用指针需谨慎,特别是数组指针混用。 ...


谢谢!各位大牛的指点!主要是自己对M3内核不熟悉造成的问题。于是,我仔细参考《CM3权威指南》查看了M3内核有关异常处理的相关章节,第七**章,我使能了总线fault,存储fault和用法fault中断,使他们不能上访成硬fault。发现出错时跳入了存储fault(MemManage fault 状态寄存器(MFSR地址:0xE000_ED28)的最低位被置1,也就是取指访问违例),按照第9章,异常中断压栈,出栈顺序,找到了出错的位置(语句)。至此,问题应该解决了。可是,我却束手无策了……怎么消除这个fault呢???也就是说问题找到了,怎么解决呢??因为我的错误发生在进入can接收中断里面和我也用了数组,取指访问违例?我仔细检查过了数组没有越界。指针指向了不该指的地方,导致违例,可是机器指令码,是由编译器决定的怎么改才能不让他产生错误代码??

使用特权

评论回复
8
ilovezeno| | 2014-1-20 11:44 | 只看该作者
看我吴钩 发表于 2014-1-11 14:03
谢谢!各位大牛的指点!主要是自己对M3内核不熟悉造成的问题。于是,我仔细参考《CM3权威指南》查看了M3 ...

你还是看看汇编出来的代码,调试的时候看看这个代码进行的计算是不是出错了吧,其实很简单的,权威指南的汇编章节读读,然后你就看懂汇编了,然后你单步汇编,自然就知道到底是什麽原因了。。。

使用特权

评论回复
9
看我吴钩|  楼主 | 2014-1-25 10:56 | 只看该作者
谢谢大家了,问题已解决!是中断重入的问题

使用特权

评论回复
10
miguojiujiu| | 2015-5-26 19:20 | 只看该作者
看我吴钩 发表于 2014-1-25 10:56
谢谢大家了,问题已解决!是中断重入的问题

你好,请问是怎么解决的,能不能帮我看一下

使用特权

评论回复
11
zh113214| | 2015-5-26 20:11 | 只看该作者
看看,谢谢楼主分享自己的经验啊

使用特权

评论回复
12
嗅嗅匆匆| | 2015-8-21 15:40 | 只看该作者
lz问题解决了吗?为什么我的程序下载进去后直接就进到了HardFault_Handler函数里面了,就连main最开始的printf函数都没有执行!这是为什么啊!

使用特权

评论回复
13
mintspring| | 2015-8-21 17:12 | 只看该作者
跑飞了,是不是指针乱用造成的

使用特权

评论回复
14
三又二分之一7| | 2015-10-10 15:48 | 只看该作者
最后受网友启发,把用到指针的地方全部换成数组,然后就好了。虽然程序繁琐了点,原本的程序中同时用到了指针和数组,可能是自己不太会用哪个角落没处理好

使用特权

评论回复
15
三又二分之一7| | 2015-10-10 15:49 | 只看该作者
嗅嗅匆匆 发表于 2015-8-21 15:40
lz问题解决了吗?为什么我的程序下载进去后直接就进到了HardFault_Handler函数里面了,就连main最开始的pri ...

最后受网友启发,把用到指针的地方全部换成数组,然后就好了。虽然程序繁琐了点,原本的程序中同时用到了指针和数组,可能是自己不太会用哪个角落没处理好

使用特权

评论回复
16
看我吴钩|  楼主 | 2016-1-12 19:41 | 只看该作者
miguojiujiu 发表于 2015-5-26 19:20
你好,请问是怎么解决的,能不能帮我看一下

已解决,我的原因是进入中断后,没有清除相关标志位,下次再进中断就重入了。是自己马虎大意了

使用特权

评论回复
17
看我吴钩|  楼主 | 2016-1-12 19:42 | 只看该作者
嗅嗅匆匆 发表于 2015-8-21 15:40
lz问题解决了吗?为什么我的程序下载进去后直接就进到了HardFault_Handler函数里面了,就连main最开始的pri ...

我的原因是进入中断后,没有清除相关标志位,下次再进中断就重入了。你自己单步调试看看

使用特权

评论回复
18
wu那w些w年| | 2017-10-9 14:43 | 只看该作者

使用特权

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

本版积分规则

8

主题

53

帖子

1

粉丝