STM32堆栈溢出的主要的问题和现象

文章详细阐述了STM32单片机中堆栈溢出的现象和问题,描述了堆和栈的运作方式,以及由此引发的内存冲突和系统不稳定状态。当堆空间过度分配且未释放时,可能导致栈指针与堆指针冲突,造成程序异常,如进入HardFault_Handler死循环。防止堆栈溢出需要手动检测堆指针越界。
摘要由CSDN通过智能技术生成

堆栈溢出主要的问题和现象

  1. 一般RAM最后两块空间是堆Heap和栈Stack,顾名思义储存后指针指向地址往上增,对于我们常常说压栈顾名思义:栈使用的时候是栈指针指向地址是往下减的,当然不同架构处理器栈的运作方式可能不一样,STM32单片机的栈是满减栈,即先移动指针再入栈,出栈的过程则是先出栈再移动栈指针。堆处于物理低地址,栈初始时栈指针指向在高地址,就出现堆和栈在内存空间中连续,所以当堆空间被用完,那么堆指针自然地指向栈区,栈空间用完栈指针就会指向堆区。如果堆空间被malloc完了,还从不free,那如果栈比较大(度),还没用到栈底且还有很大余量的话,那堆指针偷偷来了又回去了(堆申请后及时释放),那程序还会平稳运行,堆栈相安无事,当然也可以看出这种情况是有很大不确定性的,因为实际中堆申请和释放可能实时在进行,且大小不固定,这导致堆指针的每一次越界访问达到的位置可能都不一样,栈指针第一次刚好躲过,但很难保证运行中任一次都能刚好躲过,而且但凡出现一次的堆栈指针冲突都会导致系统进入不确定态,因为堆和栈中的数据可能被对方相互修改,我们知道栈中存储的是程序运行中的一些参数、函数入口地址,返回值,返回地址等等的一些信息,当返回地址错误的时候,会出现程序乱跳的情况,不符合程序设定的逻辑顺序,这种神奇的现象让人打开眼界直呼神奇同时,却让程师饱含血泪。当然STM32更多的时候会看到程序进入HardFault_Handler中的死循环,如果还开了看门狗……那就是工程师的另一出血泪了。
    2.附上STM32在有操作系统时任务入栈后,栈指针指向低地址情形:任务手动入栈后栈顶指针指向地地址
    当然如何防止堆指针溢出网上也有一些资料,即需要手动去判断堆指针是否越界,感兴趣可以访问:STM32/GD32上内存堆栈溢出探测研究
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值