OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3190|回复: 4

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

[复制链接]

3

主题

17

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2017-5-19
在线时间
4 小时
发表于 2017-5-19 13:36:57 | 显示全部楼层 |阅读模式
3金钱
本人使用的是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:\QQ\1398030584\Image\C2C\BK5FMC0N_MP@OH@ZY~RXDBG.png
对了,还有一个问题,我调试时发现它是因为bus fault进入hardfault的,但是我不懂怎么解决,网上也没找到相关的问题的解决方案。
总而言之,上述解决方案我都没成功。这个问题已经折腾了我近乎一星期了,希望能有大神能随手就帮我解决了,万分感激先行谢过!!~~
file:///D:\QQ\1398030584\Image\C2C\BK5FMC0N_MP@OH@ZY~RXDBG.png


1

1

2

2

3

3

4

4

5

5

最佳答案

查看完整内容[请看2#楼]

问题解决了,原因和printf函数关系不大,是我先入为主。问题出在我自己写的中断服务函数里,里头有个数组越界了。不过还是很谢谢大家的帮助~另期许所有如我般遇见问题的小白,当一个地方找不到问题的解决方案时,把目光放在整个工程里或许是因为其他某个函数的错误导致的。希望本人的一些教训可以帮助更多的人~~
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

17

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2017-5-19
在线时间
4 小时
 楼主| 发表于 2017-5-19 13:36:58 | 显示全部楼层
问题解决了,原因和printf函数关系不大,是我先入为主。问题出在我自己写的中断服务函数里,里头有个数组越界了。不过还是很谢谢大家的帮助~另期许所有如我般遇见问题的小白,当一个地方找不到问题的解决方案时,把目光放在整个工程里或许是因为其他某个函数的错误导致的。希望本人的一些教训可以帮助更多的人~~
回复

使用道具 举报

0

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
184
金钱
184
注册时间
2014-12-22
在线时间
39 小时
发表于 2017-5-19 22:16:29 | 显示全部楼层
是不是栈溢出?
回复

使用道具 举报

5

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
307
金钱
307
注册时间
2016-10-20
在线时间
64 小时
发表于 2017-5-20 09:19:16 | 显示全部楼层
跟踪看到哪里跳到错误的
回复

使用道具 举报

7

主题

162

帖子

0

精华

高级会员

Rank: 4

积分
541
金钱
541
注册时间
2017-4-6
在线时间
67 小时
发表于 2017-5-20 09:46:46 | 显示全部楼层
以前忘记在哪里看过查找hardfault,在网上有很多教程。

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

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-24 12:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表