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

云帆直挂 2014-01-08 09:07:33
在调试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启动文件配置正确。(我没有用OS操作系统,只是简单单片机程序)。
这两天简单研究了一下M3核的汇编指令,试着解决问题。对于跳入HardFault_Handler的问题,网上的答案,只隔靴挠痒,没有解决实质问题,说是什么,指针指向系统不允许的地方、数据数组溢出了,硬件错误,等等。
且不说是不是这些原因。我也单步调试了,关键是怎么知道数组是否越界?怎么找硬件出错的地方。或者写个汇编代码,把问题出错的地方打印出来。捣腾3天了……只好求助于各位大侠了!先谢谢
...全文
3256 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
好贴 顶一个
云帆直挂 2014-01-25
  • 打赏
  • 举报
回复
问题已解决,是中断重入的问题
云帆直挂 2014-01-11
  • 打赏
  • 举报
回复
请教3楼,你怎么让你的指针不再指向系统不允许的地方??产生的指令代码不是编译器决定的吗??怎么改??
引用 3 楼 mome11 的回复:
今天刚解决了一个出现跳入HardFault_Handler的问题,原因是指针指向系统不允许的地方。 如果你有条件仿真,跟踪一下是在那里出的问题
云帆直挂 2014-01-11
  • 打赏
  • 举报
回复
谢谢!各位大牛的指点!谢谢!如2楼所说,我发完帖子,立马就意识到了自己对M3核不熟悉,不熟悉就知道瞎问,这种态度要不得,不过既然发帖了,就发了,呵呵。但是,在我参考《CM3权威指南》查看了M3内核有关异常处理的相关章节,第七八九章,我使能了总线fault,存储fault和用法fault中断,使他们不能上访成硬fault。发现出错时跳入了存储fault(MemManage fault 状态寄存器(MFSR地址:0xE000_ED28)的最低位被置1,也就是取指访问违例),按照第9章,异常中断压栈,出栈顺序,找到了出错的位置(语句)。至此,问题应该解决了。可是,我却束手无策了……怎么消除这个fault呢???

因为我的错误发生在进入can接收中断里面和我也用了数组,取指访问违例?我仔细检查过了数组没有越界。到不可执行指令的regions……
senioryzc 2014-01-10
  • 打赏
  • 举报
回复
且R14(LR)寄存器的值为一个莫名的地址0xfffffff1 从这个说明你对M3不了解,别人说再多也是白说 发到有专门的stm32子论坛的版块去吧,或许有人会从0开始教你 对于出现HardFault,怎么找出问题的时候的pc值,网上一大堆文章已经说的很详细
默寞 2014-01-10
  • 打赏
  • 举报
回复
今天刚解决了一个出现跳入HardFault_Handler的问题,原因是指针指向系统不允许的地方。 如果你有条件仿真,跟踪一下是在那里出的问题
andy_wsj 2014-01-09
  • 打赏
  • 举报
回复
定时器4中断代码有问题,这不是显而易见的吗?

21,620

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧