STM32硬件错误HardFault_Handler的处理方法

STM32硬件错误HardFault_Handler的处理方法_electrocrazy的博客-CSDN博客_hardfault_handler

Documentation – Arm Developer

Keil 生成的Map文件分析_Taoo-CSDN博客_keil map文件

[014] [ARM-Cortex-M3/4] Usage Fault 使用错误异常实战_柯西的彷徨的博客-CSDN博客

stm32死机问题的处理_raoxu1154492168的博客-CSDN博客_stm32 死机

http://www.only2fire.com/archives/127.html

https://www.armbbs.cn/forum.php?mod=viewthread&tid=108535&extra=page%3D2

堆栈溢出问题分析

在开发过程中,我们有时候可能会遇到数据错误的情况,而这个情况发生多数是由于堆栈溢出导致,这里我们将详细讲解复现堆栈溢出会导致的问题及提供相应的解决方法。
1 .建立一个测试工程

定义主函数

定义堆栈地址大小,分别都定义为0x00000200;

编译后查看生成的.map文件,可以看到栈起始地址为0x20000d50,大小为512byte。
2. 理论计算分析
程序定义了全局变量大小为32位(对应4字节)的700个数据,所以全局变量占用RAM空间计算:
G=0x20000000 + 4*700 = 0x20000AF0
由于栈地址是向下生长方式,我们定义了局部变量数据大小为500个32位的数,所以实际运行时局部变量占用RAM的起始地址为:
L=0x20000D50 + 512 – 4*500 = 0x20000780
所以局部变量占用RAM的地址范围为:0x20000780 --- 0x20000F50
由上计算可知,局部变量部分地址空间与全局变量使用的地址空间有冲突,这将导致程序运行过程全局变量数值被局部变量替换掉。
3. 测试论证
程序运行测试如下图所示:

全局变量初始化完成

初始化局部变量,由上图可看出原来全局变量的数值已被局部变量替换
4. 解决方法
4.1 理论计算
由之前可以算出局部变量使用了2000byte的RAM地址空间,由于堆栈地址设置要求是0x0100的整数倍,所以这里可以将大小设置为0x0800,即2048个字节数据。
4.2 设置栈空间大小
改大栈空间大小,如下图所示:

修改栈空间大小后查看生成的.map文件,如下图所示:

4.3 修改后测试验证

由上图测试可以知道,局部变量存储地址已经从0x20000D80开始,与全局变量存储地址不冲突,至此可以解决遇到的堆栈溢出问题。
         上述方法已解决了我们遇到的堆栈溢出问题,但实际编程时,我们不建议在子函数中使用大数组
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值