STM32堆栈溢出

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

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

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

STM32堆栈溢出的主要的问题和现象相关推荐

  1. STM32堆栈溢出问题

    通过map文件了解堆栈分配(STM32.MDK5)--避免堆栈溢出 环境:STM32F103C8T6,MDK5 在最近的一个项目的开发中,每当调用到一个函数,程序就直接跑飞.debug跟进去看不出什么 ...

  2. STM32 堆栈溢出检测

    前言 在单片机中,栈stack由编译器自动分配释放,用于存放函数调用,局部变量等数据.堆heap用于动态内存分配.堆栈可以在启动文件或者链接脚本中指定大小,但在实际开发中,尤其工程量较大的项目中难以确 ...

  3. STM32堆栈溢出的问题

    在程序中出现栈溢出的情况,就是分配局部变量时因为内存溢出而重启,局部变量分配在栈中,栈区域满了导致溢出,需要修改startup_stm32f10x_hd.s中,或startup_stm32f10x_l ...

  4. FreeRTOS中的任务堆栈溢出检测机制

    关注+星标公众号,不错过精彩内容 转自 | 麦克泰技术 在FreeRTOS中,每个任务都拥有自己的堆栈,该堆栈的大小由创建任务时xTaskCreate函数的函数参数所决定. 但当任务所使用的堆栈空间超 ...

  5. STM32 堆栈大小的设置及分析

    一.通过map文件了解堆栈分配(STM32.MDK5)--避免堆栈溢出 环境:STM32F103C8T6,MDK5 在最近的一个项目的开发中,每当调用到一个函数,程序就直接跑飞.debug跟进去看不出 ...

  6. 【前端】递归之引起堆栈溢出解决方案

    简介:递归引起错误VM434:1 Uncaught RangeError: Maximum call stack size exceeded 优化前递归 ``` function obj(x,y){i ...

  7. Springboot+JPA 对应关系查询时导致的堆栈溢出 :java.lang.StackOverflowError:

    在JPA的对应关系中,如果加了一对一或者一对多或者多对多的对应关系,级联查询,一不小心就会造成查询对象里面的对象,而里面的对象又包括外面对象,循环往复无休止,就会堆栈溢出了. 解决方法,加入注解让JP ...

  8. C语言再学习 -- Stack Overflow(堆栈溢出)

    参看:Stack Overflow(堆栈溢出) Visual Studio执行出现Stack Overflow,该怎么处理呢? 一.产生原因 Stack Overflow(堆栈溢出)是程序调试中比较麻 ...

  9. 45.JVM调优策略、常见问题:内存泄漏(年老代堆空间被占满、持久代被占满、堆栈溢出、线程堆栈满、系统内存被占满)优化方法:优化目标、优化GC步骤、优化总结;案例分析(公司系统参数、网上给的配置参数)

    45.JVM调优策略 45.1.常见问题 45.1.1.内存泄漏 45.1.1.1.年老代堆空间被占满 45.1.1.2.持久代被占满 45.1.1.3.堆栈溢出 45.1.1.4.线程堆栈满 45. ...

最新文章

  1. Docker 使用教程
  2. 利用java反射机制,子类从父类拷贝属性--解决信息修改类设计的模式
  3. Jmeter之解决烦人的中文乱码问题
  4. 页面分栏LayoutInflater
  5. mysql+alter+int_MySQL Alter命令
  6. 压缩感知 热身实验 OMP算法Python实现(详细代码注释)
  7. linux http嗅探工具 httpry
  8. 微信跳转APP最全解析
  9. Badboy提示脚本错误解决方法
  10. Unity 贴图Meta文件的探究
  11. python计算md5码
  12. 读者投稿:阿里 P6 面试体验
  13. BibTeX的使用方法
  14. STM32F103 内部温度传感器实验
  15. 思迈特Smartbi数据填报功能
  16. RC522读卡、修改UID、复制门禁卡(arduino板子)
  17. 腾讯云 sdk调用 显示 图片解码失败 解决方案
  18. Java 之父Oracle
  19. Nu2menu 插件
  20. 《Adobe Photoshop大师班:高级合成的秘密》—第1章文件格式

热门文章

  1. android 仿qq 通讯录,Android端IM应用中的@人功能实现:仿微博、QQ、微信,零入侵、高可扩展[图文+源码]...
  2. 2023 iApp 图片漫画化源码
  3. selenium源码通读·4 |webdriver/common分析
  4. Mentor Graphics LP Wizard 软件使用----创建零件BGA封装库
  5. Gurobi--Error code: 10005. Unable to retrieve attribute solved ‘Pi‘ 解决
  6. 你的手帕再也不干净了_我再也不会将手机带回国际航班了。 你也不要
  7. 开发管理---配置管理与文档管理
  8. 【原创】VBA学习笔记(300)VBA 很多工作表函数都只对1维数组有用,用2维数组上经常报错!
  9. svg + image/svg+xml 文件上传实现xss
  10. 【云栖大会】你拿到2016杭州·云栖大会的入场券了吗?