使用printf循环打印字符串时,进HardFault_Handler。被困好几天,希望有大神解决。

2019-08-18 20:25发布

本人使用的是STM32F103C8T6芯片。我把代码贴出来放在图片附件,具体情况是这样的:我需要循环不断向上位机打印字符串,然而使用printf函数打印字符时只有循环开始时可用,然后循环第二次或者第三次时就会进HardFault_Handler。(也就是说它可以打印字符,只是只能打印出两组到三组就因为进硬错误而不再打印了)也曾看过相似问题的帖子,对于他们给出的解决方案也尝试过。
首先是对printf函数本身进硬错误的解决方案有:通过对字符的定义添加__align(4)进行修饰,主要解决字符对齐造成的问题,同样的解决方案还有在程序初始时添加SCB->CCR |= 0x200;也是为了实现字节对齐。
其次对进HardFault_Handler本身的调试方法,通常不外乎需要对进错误语句进行定位。例如http://blog.csdn.net/xiahouzuoxin/article/details/10068455这篇文档所提供的方法,但是对于这种方法再进行hardfault右键show caller code 这一步时,软件提示cannot access memory,具体如附件图5。file:///D:QQ1398030584ImageC2CBK5FMC0N_MP@OH@ZY~RXDBG.png
对了,还有一个问题,我调试时发现它是因为bus fault进入hardfault的,但是我不懂怎么解决,网上也没找到相关的问题的解决方案。
总而言之,上述解决方案我都没成功。这个问题已经折腾了我近乎一星期了,希望能有大神能随手就帮我解决了,万分感激先行谢过!!~~
file:///D:QQ1398030584ImageC2CBK5FMC0N_MP@OH@ZY~RXDBG.png


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
DownStars
1楼-- · 2019-08-18 22:36
问题解决了,原因和printf函数关系不大,是我先入为主。问题出在我自己写的中断服务函数里,里头有个数组越界了。不过还是很谢谢大家的帮助~另期许所有如我般遇见问题的小白,当一个地方找不到问题的解决方案时,把目光放在整个工程里或许是因为其他某个函数的错误导致的。希望本人的一些教训可以帮助更多的人~~
so
2楼-- · 2019-08-19 03:46
是不是栈溢出?
hasaki
3楼-- · 2019-08-19 09:00
跟踪看到哪里跳到错误的
JUSTNIUB
4楼-- · 2019-08-19 13:50
以前忘记在哪里看过查找hardfault,在网上有很多教程。

过程如下:
1.进入hardfault后,在左侧project那一栏下方的项目中有 register一项,点进去,找到R13,复制内容,这是一个地址。
2.打开memory 窗口,该窗口的左上方有Address一栏,将刚刚复制的内容粘贴进去,回车。搜索到内容之后,右键在memory窗口内随便点一下,在unsigned选项的后面一栏中切换成int。再找到刚刚复制的地址对应的32位数据,往后数6个(也有可能是7个),再复制该内容、
3.在Disassembly窗口中右键一下,有个Show Disassembly in address选项,点进去,再粘贴,这里要在数据前面加上0x,然后就能定位到一个位置,再双击这个位置,就是出错的代码。

一周热门 更多>