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

[复制链接]
18278|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
 楼主| 看我吴钩 发表于 2014-1-11 14:01 | 显示全部楼层
谢谢!各位大牛的指点!主要是自己对M3内核不熟悉造成的问题。于是,我仔细参考《CM3权威指南》查看了M3内核有关异常处理的相关章节,第七**章,我使能了总线fault,存储fault和用法fault中断,使他们不能上访成硬fault。发现出错时跳入了存储fault(MemManage fault 状态寄存器(MFSR地址:0xE000_ED28)的最低位被置1,也就是取指访问违例),按照第9章,异常中断压栈,出栈顺序,找到了出错的位置(语句)。至此,问题应该解决了。可是,我却束手无策了……怎么消除这个fault呢???也就是说问题找到了,怎么解决呢??因为我的错误发生在进入can接收中断里面和我也用了数组,取指访问违例?我仔细检查过了数组没有越界。指针指向了不该指的地方,导致违例,可是机器指令码,是由编译器决定的怎么改才能不让他产生错误代码??
 楼主| 看我吴钩 发表于 2014-1-11 14:03 | 显示全部楼层
ilovezeno 发表于 2014-1-8 09:18
你用英文在google上搜搜,三秒钟出方法,简单方便。。。。你用中文?那你继续找吧。。。。
Hardfault会自动 ...

谢谢!确实是!
 楼主| 看我吴钩 发表于 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接收中断里面和我也用了数组,取指访问违例?我仔细检查过了数组没有越界。指针指向了不该指的地方,导致违例,可是机器指令码,是由编译器决定的怎么改才能不让他产生错误代码??
ilovezeno 发表于 2014-1-20 11:44 | 显示全部楼层
看我吴钩 发表于 2014-1-11 14:03
谢谢!各位大牛的指点!主要是自己对M3内核不熟悉造成的问题。于是,我仔细参考《CM3权威指南》查看了M3 ...

你还是看看汇编出来的代码,调试的时候看看这个代码进行的计算是不是出错了吧,其实很简单的,权威指南的汇编章节读读,然后你就看懂汇编了,然后你单步汇编,自然就知道到底是什麽原因了。。。
 楼主| 看我吴钩 发表于 2014-1-25 10:56 | 显示全部楼层
谢谢大家了,问题已解决!是中断重入的问题
miguojiujiu 发表于 2015-5-26 19:20 | 显示全部楼层
看我吴钩 发表于 2014-1-25 10:56
谢谢大家了,问题已解决!是中断重入的问题

你好,请问是怎么解决的,能不能帮我看一下
zh113214 发表于 2015-5-26 20:11 | 显示全部楼层
看看,谢谢楼主分享自己的经验啊
嗅嗅匆匆 发表于 2015-8-21 15:40 | 显示全部楼层
lz问题解决了吗?为什么我的程序下载进去后直接就进到了HardFault_Handler函数里面了,就连main最开始的printf函数都没有执行!这是为什么啊!
mintspring 发表于 2015-8-21 17:12 | 显示全部楼层
跑飞了,是不是指针乱用造成的
三又二分之一7 发表于 2015-10-10 15:48 | 显示全部楼层
最后受网友启发,把用到指针的地方全部换成数组,然后就好了。虽然程序繁琐了点,原本的程序中同时用到了指针和数组,可能是自己不太会用哪个角落没处理好
三又二分之一7 发表于 2015-10-10 15:49 | 显示全部楼层
嗅嗅匆匆 发表于 2015-8-21 15:40
lz问题解决了吗?为什么我的程序下载进去后直接就进到了HardFault_Handler函数里面了,就连main最开始的pri ...

最后受网友启发,把用到指针的地方全部换成数组,然后就好了。虽然程序繁琐了点,原本的程序中同时用到了指针和数组,可能是自己不太会用哪个角落没处理好
 楼主| 看我吴钩 发表于 2016-1-12 19:41 | 显示全部楼层
miguojiujiu 发表于 2015-5-26 19:20
你好,请问是怎么解决的,能不能帮我看一下

已解决,我的原因是进入中断后,没有清除相关标志位,下次再进中断就重入了。是自己马虎大意了
 楼主| 看我吴钩 发表于 2016-1-12 19:42 | 显示全部楼层
嗅嗅匆匆 发表于 2015-8-21 15:40
lz问题解决了吗?为什么我的程序下载进去后直接就进到了HardFault_Handler函数里面了,就连main最开始的pri ...

我的原因是进入中断后,没有清除相关标志位,下次再进中断就重入了。你自己单步调试看看
wu那w些w年 发表于 2017-10-9 14:43 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

53

帖子

1

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