OpenEdv-开源电子网

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

使用printf函数打印出一些字符后 进入HardFault_Handler

[复制链接]

51

主题

214

帖子

0

精华

高级会员

Rank: 4

积分
561
金钱
561
注册时间
2011-4-11
在线时间
43 小时
发表于 2012-12-20 15:53:24 | 显示全部楼层 |阅读模式
Average_Voltage_Value = Average_Voltage();
printf("Voltage is %5.4f V\n",Average_Voltage_Value);  
打印出字符串“Voltage is 3 ”  就进入了HardFault_Handler中断了,不知道怎么回事。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

25

主题

683

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1351
金钱
1351
注册时间
2012-4-25
在线时间
195 小时
发表于 2012-12-20 17:32:05 | 显示全部楼层
1-1
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-12-20 17:36:20 | 显示全部楼层
Average_Voltage_Value
加一个修饰词,改为:
__align(4) float Average_Voltage_Value
再试试。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

51

主题

214

帖子

0

精华

高级会员

Rank: 4

积分
561
金钱
561
注册时间
2011-4-11
在线时间
43 小时
 楼主| 发表于 2012-12-21 09:34:06 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
O(∩_∩)O哈哈~  你真是知识渊博。好像情况很好了。
现在没有加__align(4)修饰的时候出现了输出错误数据。
Voltage is 3Voltage_Buff is 372
本来应该输出的是“Voltage is 37257Voltage_Buff is 372”   怎么不加__align(4)修饰就会这样子呢??

我做的做的是一个有关GSM的装置,
(1)GSM没有短信收发的时候,float Average_Voltage_Value这样定义的,所有的执行都正常,采集电压温度,printf输出一切都正常。
(2)但是当有GSM短信收发的时候,如果没有加__align(4)就进入HardFault_Handler了(昨天会,不过今天好像不会,就是会输出不正常而已)。加入__align(4)之后都正常了,也不会进入HardFault_Handler,输出也正常了。

所以感觉很迷惑。我做做实验,用示波器采集一下电源电压,看是不是GSM收发短信时候将MCU电压拉低了。顺便看看你提示的__align(4)是起什么作用。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-12-21 10:51:39 | 显示全部楼层
回复【4楼】Julius007:
---------------------------------
http://www.openedv.com/posts/list/10059.htm
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

51

主题

214

帖子

0

精华

高级会员

Rank: 4

积分
561
金钱
561
注册时间
2011-4-11
在线时间
43 小时
 楼主| 发表于 2012-12-21 13:54:41 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
谢谢这么快回复我。
这几天意识到了一个以前一直没有注意的问题,“内存越界”“堆栈溢出”等问题。这些问题很容易导致HardFault_Handler问题,特别是处理字符串的时候,字符串函数处理字符串的时候大多数要找到‘\0’才结束操作的,所以如果一个字符串漏了‘\0’,他就会一直找下去,直到处理到\0,所以就会访问别的内存或者修改别的内存内容,导致出错。
回复 支持 反对

使用道具 举报

7

主题

67

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2013-10-5
在线时间
9 小时
发表于 2014-8-9 22:37:34 | 显示全部楼层
回复【6楼】Julius007:
---------------------------------
楼主两年前的发言解决了我一个调了一晚都调不通的程序
回复 支持 反对

使用道具 举报

18

主题

48

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
321
金钱
321
注册时间
2014-2-4
在线时间
10 小时
发表于 2014-9-6 11:35:50 | 显示全部楼层
这个问题纠结的我啊,感谢楼主
选择了就别再后悔
回复 支持 反对

使用道具 举报

15

主题

115

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
396
金钱
396
注册时间
2013-7-12
在线时间
64 小时
发表于 2014-9-17 17:07:20 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------

我也遇见的hardfault

请问原子哥,楼主的问题为何要指定4字节对齐,根据什么来指定的?没理解
提供工业物联网整体解决方案!
https://shop469761648.taobao.com/?spm=2013.1.0.0.3e0568ccstLyMK
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-9-17 23:23:06 | 显示全部楼层
回复【9楼】zxcmcu:
---------------------------------
我的根据就是会不会死机。
详细的你可以百度学习下字节对齐,然后继续深入了解sprintf,printf等函数对内存的要求。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2014-10-9 11:25:16 | 显示全部楼层
回复【10楼】正点原子:
---------------------------------
怎么知道__align(4)括号里面应该写4还是8还是100呢?
小小蜗牛
回复 支持 反对

使用道具 举报

65

主题

440

帖子

0

精华

高级会员

Rank: 4

积分
782
金钱
782
注册时间
2012-8-29
在线时间
17 小时
发表于 2014-10-9 11:30:37 | 显示全部楼层
回复【11楼】jiutianshenjian:
---------------------------------
4x8=32
人生永远追逐着幻光,但谁把幻光看作幻光,谁便沉入无边的苦海
回复 支持 反对

使用道具 举报

27

主题

91

帖子

0

精华

初级会员

Rank: 2

积分
137
金钱
137
注册时间
2014-8-11
在线时间
3 小时
发表于 2015-6-29 20:54:36 | 显示全部楼层
回复【10楼】正点原子:
---------------------------------
深入了解sprintf,printf等函数对内存的要求。

这句话我现在才发现很重要。 

我在调试一个别人写的工程时,printf函数打印变量。运行几十条打印语句后,在某一条就进入了硬件失败函数。

我真是不懂printf函数对内存有什么要求啊? 大师能否指点下?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-6-29 22:16:01 | 显示全部楼层
回复【13楼】xinshou:
---------------------------------
需求是看你printf什么东东的,很明显printf浮点数,比整数,堆栈需求要大得多。
不过具体的计算公式,我也没有,处错误就往这方面想想吧。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

27

主题

91

帖子

0

精华

初级会员

Rank: 2

积分
137
金钱
137
注册时间
2014-8-11
在线时间
3 小时
发表于 2015-6-30 10:20:19 | 显示全部楼层
回复【14楼】正点原子:
---------------------------------
非常感谢你的指点。你这里说的“堆栈需求要大得多”指的是栈的字节数还是堆的字节数? 我的理解是栈的字节数。对么?我的栈设置了8000个字节,怎么还是发现出了错误呢?

       times++; 
        if(times%100000 == 0)  { WPRINT_DEBUG(( "Waiting get sema, times=%d...  \r\n", ()times)); } 

      当times=100000时,后面的打印语句出现了错误:

         Invalid State usage fault - Illegal use of EPSR was attempted

EPSR  =  Execution Program Status Register

回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-28 02:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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