6522|13

327

帖子

1

TA的资源

纯净的硅(初级)

楼主
 

HardFault_Handler异常 [复制链接]

 
请教各位,最近用MDK5.11编写STM32F103RC的程序,但是却莫名其妙进入HardFault_Handler异常中断,现在本人完全一头雾水,还请大神指点迷津!


此帖出自stm32/stm8论坛

最新回复

开个全局缓冲区重复利用这个缓冲  详情 回复 发表于 2017-11-8 12:55
点赞 关注
个人签名模电临时工
 

回复
举报

6040

帖子

202

TA的资源

版主

沙发
 
你这种写法我第一次见,你把字符串外面的大括号去了再调
此帖出自stm32/stm8论坛

点评

大括号也去掉了,按照你们的建议能改的都改了还是在同样的位置进入HardFault_Handler异常中断。[attachimg]329066[/attachimg]  详情 回复 发表于 2017-11-8 08:41
 
 

回复

4008

帖子

0

TA的资源

版主

板凳
 
变量声明要放在函数开始,另外你常量最好加const放到flash里
此帖出自stm32/stm8论坛

点评

一般在keil的arm开发环境,C编译器都支持C99特性,在函数中可以在需要的地方临时定义变量,而不需要一定要在函数开始之前。  详情 回复 发表于 2017-11-8 09:25
情况是这样的:“char FileName[18]={"/UNESD/THXXXX.CSV"};”这些看似常量的数组,实际不能做常量,因为:注意THXXXX.CSV中的4个X是要重新赋值的下面的一个数组也是一样,所以不能用常量;另外我试了一下把下面几个  详情 回复 发表于 2017-11-8 08:30
 
 

回复

327

帖子

1

TA的资源

纯净的硅(初级)

4
 
huo_hu 发表于 2017-11-7 18:48
变量声明要放在函数开始,另外你常量最好加const放到flash里

情况是这样的:“char        FileName[18]={"/UNESD/THXXXX.CSV"};”这些看似常量的数组,实际不能做常量,因为:注意THXXXX.CSV中的4个X是要重新赋值的下面的一个数组也是一样,所以不能用常量;另外我试了一下把下面几个大数组放到函数开始位置也还是不行仍然在同样的位置进入HardFault_Handler异常中断
此帖出自stm32/stm8论坛
 
个人签名模电临时工
 
 

回复

327

帖子

1

TA的资源

纯净的硅(初级)

5
 
lcofjp 发表于 2017-11-7 18:14
你这种写法我第一次见,你把字符串外面的大括号去了再调

大括号也去掉了,按照你们的建议能改的都改了还是在同样的位置进入HardFault_Handler异常中断。
此帖出自stm32/stm8论坛

点评

你的栈空间设置的多大?你的局部变量太大了,会不会溢出了  详情 回复 发表于 2017-11-8 09:21
 
个人签名模电临时工
 
 

回复

1976

帖子

0

TA的资源

五彩晶圆(初级)

6
 
会不会是堆栈溢出了,你把file name这个变量放到函数外面让它成为全局变量试试
此帖出自stm32/stm8论坛
 
 
 

回复

6040

帖子

202

TA的资源

版主

7
 
shipeng 发表于 2017-11-8 08:41
大括号也去掉了,按照你们的建议能改的都改了还是在同样的位置进入HardFault_Handler异常中断。

你的栈空间设置的多大?你的局部变量太大了,会不会溢出了
此帖出自stm32/stm8论坛

点评

是不是堆栈空间一定要大于我的局部变量?  详情 回复 发表于 2017-11-8 09:36
 
 
 

回复

1976

帖子

0

TA的资源

五彩晶圆(初级)

8
 
huo_hu 发表于 2017-11-7 18:48
变量声明要放在函数开始,另外你常量最好加const放到flash里

一般在keil的arm开发环境,C编译器都支持C99特性,在函数中可以在需要的地方临时定义变量,而不需要一定要在函数开始之前。
此帖出自stm32/stm8论坛
 
 
 

回复

327

帖子

1

TA的资源

纯净的硅(初级)

9
 
lcofjp 发表于 2017-11-8 09:21
你的栈空间设置的多大?你的局部变量太大了,会不会溢出了

是不是堆栈空间一定要大于我的局部变量?
此帖出自stm32/stm8论坛

点评

各位问题解决的原因是堆栈溢出,感谢大家的热心回复,特别lcofjp的7楼提醒,之前堆栈空间是默认的Stack_Size EQU 0x00000400后来通过查资料怀疑过这方面的原因改过一次Stack_Size EQU 0x00000800  详情 回复 发表于 2017-11-8 09:48
局部变量是在栈里分配的,你觉得呢  详情 回复 发表于 2017-11-8 09:48
 
个人签名模电临时工
 
 

回复

327

帖子

1

TA的资源

纯净的硅(初级)

10
 
本帖最后由 shipeng 于 2017-11-8 09:49 编辑
shipeng 发表于 2017-11-8 09:36
是不是堆栈空间一定要大于我的局部变量?

各位问题解决了原因是堆栈溢出,感谢大家的热心回复,特别感谢lcofjp的7楼提醒,之前堆栈空间是默认的Stack_Size      EQU     0x00000400后来通过查资料怀疑过这方面的原因改过一次Stack_Size      EQU     0x00000800也还是不行,最后隐隐约约想起临时变量都是定义在堆栈中的,我的大数组临时变量大小为0x1400因此之前的0x400和0x800都是不够的,改为Stack_Size      EQU     0x00002000后完美解决!
此帖出自stm32/stm8论坛
 
个人签名模电临时工
 
 

回复

6040

帖子

202

TA的资源

版主

11
 
shipeng 发表于 2017-11-8 09:36
是不是堆栈空间一定要大于我的局部变量?

局部变量是在栈里分配的,你觉得呢
此帖出自stm32/stm8论坛
 
 
 

回复

4008

帖子

0

TA的资源

版主

12
 
你这个应该优化一下,没必要搞这么多局部变量
此帖出自stm32/stm8论坛

点评

我感觉一个都不能少啊,我这个程序是用在一款:可导出数据至U盘的温湿度计上面的,温湿度数据存储在25Q16上,而我的25Q16数据存储是按照4096Byte为存储单元存的,因此有一个读取25Q16的4096字节的数组。还有一个1024  详情 回复 发表于 2017-11-8 11:10
 
 
 

回复

327

帖子

1

TA的资源

纯净的硅(初级)

13
 
huo_hu 发表于 2017-11-8 10:33
你这个应该优化一下,没必要搞这么多局部变量

我感觉一个都不能少啊,我这个程序是用在一款:可导出数据至U盘的温湿度计上面的,温湿度数据存储在25Q16上,而我的25Q16数据存储是按照4096Byte为存储单元存的,因此有一个读取25Q16的4096字节的数组。还有一个1024Byte的数组是用作CH376的写入缓存,写入数据累积满整数个扇区(512字节的整数倍)再写入CH376可以大幅提升U盘的读写效率以及节约擦写寿命。
此帖出自stm32/stm8论坛

点评

开个全局缓冲区重复利用这个缓冲  详情 回复 发表于 2017-11-8 12:55
 
个人签名模电临时工
 
 

回复

4008

帖子

0

TA的资源

版主

14
 
shipeng 发表于 2017-11-8 11:10
我感觉一个都不能少啊,我这个程序是用在一款:可导出数据至U盘的温湿度计上面的,温湿度数据存储在25Q16 ...

开个全局缓冲区重复利用这个缓冲
此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表