一、通过map文件了解堆栈分配(STM32、MDK5)--避免堆栈溢出

环境:STM32F103C8T6,MDK5

在最近的一个项目的开发中,每当调用到一个函数,程序就直接跑飞。debug跟进去看不出什么逻辑错误,但发现函数内局部变量声明之后,全局变量的值被清零,后来查看局部变量地址已经超出栈的范围,于是确定是栈溢出。如果不稍微了解一下堆栈,在开发过程中可能碰到各种奇怪的错误。

二、.map和startup.s文件

MAP 文件是程序的全局符号、源文件和代码行号信息的唯一的文本表示方法,它可以在任何地方、任何时候使用,不需要有额外的程序进行支持。

在MDK5中,在项目中双击Target就能自动打开.map文件。

Startup.s文件是系统的启动文件,主要包括堆和栈的初始化配置、中断向量表的配置以及将程序引导到main( )函数等。

Startup.s主要完成三个工作:栈和堆的初始化、定位中断向量表、调用Reset Handler。

三、堆栈作用

栈(stack)空间,用亍局部变量,函数调时现场保护和返回地址,函数的形参等。

堆(heap)空间,主要用亍劢态内存分配,也就是说用 malloc,calloc, realloc 等函数分配的变量空间是在堆上。

四、堆栈在内存分布

在map文件中搜索STACK或者HEAP,在接近文件底部的位置可以看到SRAM的分配,如下图。

从上图中可以看出SRAM空间用来存放:1、各个文件中声明和定义的全局变量、静态数据和常量;2、HEAP区;3、STACK区。

STM32的堆栈是存放在SRAM中的,分配堆栈大小需要考虑SRAM容量。

在.map文件中的Image Symbol Table底下可以找到如下图所示堆栈分布信息。

堆在使用时会从低地址往上加,而栈是从__initial_sp开始往下减。以上图中的堆栈地址为例,malloc会从0x20002248开始往上加,局部变量的分配会从0x20004448开始往下减。如果入栈元素过大,使得入栈元素的地址访问到了0x20002448之后的内容,就发生了栈溢出,首先会改变堆中的元素值,如果入栈元素够大,可能会直接改变HEAP后面的全局变量。同理,当动态申请的内存过大时,堆中变量越界到栈中,此时就发送堆溢出。

避免产生这类错误的产生,程序设计时就应该考虑变量大小和堆栈大小是否合适。一个是减少过大的临时变量和动态申请内存,另一个是在SRAM空间允许的情况下增大堆栈大小,如上图中栈大小是8192字节,堆大小是512。

五、堆栈大小设置

MDK5中可以通过修改startup.s文件来设置堆栈大小,只需要修改startup.s文件中的Stack_Size和Heap_Size即可,如下图所示。

KEIL Uvison5中默认生成的startup.s文件是只读的,无法修改,只需要设置一下该文件的属性,把只读取消即可。

STM32 堆栈大小的设置及分析相关推荐

  1. STM32堆栈大小及位置

    STM32的地址空间映射: 首先STM32的堆栈是存放在片上静态SRAM中的,地址分配可以见Keil的编译map文件: HEAP  0x200106f8  Section  512  startup_ ...

  2. 使用map文件 查看stm32 堆栈大小 及 堆栈分配 图

    **1.**打开map文件搜索heap或stack,如下图 **2.**堆栈分配图 静态栈区stack的地址分配顺序(低->高):先RO常量.再RW已赋初值的全局变量.后ZI未赋初值的全局变量.

  3. STM32 cubeIDE 堆栈大小设置

    CubeIDE编译器堆栈大小在工程目录列表xxx_FLASH.ld文件中, _Min_Heap_Size = 0x200 ; /* required amount of heap */ _Min_St ...

  4. esp32 怎么分配freertos 堆栈大小_详解STM32单片机的堆栈

    学习STM32单片机的时候,总是能遇到"堆栈"这个概念.分享本文,希望对你理解堆栈有帮助. 对于了解一点汇编编程的人,就可以知道,堆栈是内存中一段连续的存储区域,用来保存一些临时数 ...

  5. 深入分析MCU堆栈的作用,以及该如何设置堆栈大小

    置顶/星标公众号,不错过每一条消息 前段时间分享文章<从嵌入式编程中感悟「栈」为何方神圣?>之后,很多朋友问了关于堆栈的问题.今天就写点相关内容,让大家进一步了解堆栈的知识. 1写在前面 ...

  6. 如何设置RTOS任务的堆栈大小?

    关注+星标公众号,不错过精彩内容 转自 | 麦克泰技术 基于RTOS的应用中,每个任务都拥有自己的堆栈空间.堆栈设置过大,会造成内存资源浪费:设置过小,可能导致运行过程中的任务栈溢出,从而导致一些奇怪 ...

  7. iar 堆栈设置_IAR MSP430设置合理堆栈大小(the stack pointer for stack is outside the stack range)...

    摘要: 本文给出IAR设置堆栈合理大小的详细方法,并分享一些好博文(icf及map讲解). 最近在MSP430-169LCD(MSP430F169,RAM为2KB)调试一些ucos演示例子,IAR f ...

  8. 设置线程堆栈大小_哇擦,传说中的堆栈溢出和快速排序

    stack overflow 堆栈溢出和快速排序这两个概念对开发人员来说并不陌生,但是通知都只是听说过,真正开发过程中却很少会遇到.我也是敲代码好些行后非常有幸撞上了,而且还是两个一起出现的,这其中过 ...

  9. Keil/MDK(2):STM32堆栈使用情况分析

    目录 一.概述 二..htm文件 三..s启动文件 一.概述 这一节主要记录下堆栈空间的设置.首先看下堆栈的概念: 栈区(stack):由编译器自动分配和释放,存放函数的参数值.局部变量的值等,其操作 ...

最新文章

  1. 机器学习算法与Python实践之(二)支持向量机(SVM)初
  2. SD--va01的屏幕增强
  3. C++中的三种继承public,protected,private(转)
  4. macos降级_iOS12.3 beta2更新了什么 iOS12.3测试版2新特性与升降级方法
  5. 让你python代码更快的3个小技巧
  6. 程序员——神圣的职业
  7. easymock接口模拟_EasyMock模拟异常
  8. IE、火狐导入收藏夹乱码解决方案
  9. 电气计算机基础知识,电气基础知识
  10. 2021年山东大学考研数字电路906真题
  11. 计算机英语背诵发音,联想法巧记英语单词5000发音记忆法背单词
  12. 基于STM32制作万能遥控器---2
  13. 他25岁进贝尔实验室,32岁提信息论,40岁办达特茅斯会议,晚年患上阿兹海默 | 人物志
  14. 基于Android的BMI指数运算
  15. CNN卷积神经网络误差反传推导
  16. ubuntu18.10安装redshift护眼软件
  17. 【python】程序结构
  18. FIX协议教程1-什么是FIX会话和管理消息
  19. 每天一个编程题·iOS开发算法提升计划(1)
  20. 苏世民:顶尖领导者的52条法则

热门文章

  1. FileReader的使用方法
  2. 关于DB2数据库和SQL
  3. 语音识别原理与应用学习笔记
  4. 马达调速器,直流马达调速器,直流调速器
  5. 几款实用的内网穿透工具
  6. Ant Design vue 改变表格背景颜色
  7. 现代控制理论课件分享及课后思考题(初稿待完善)
  8. Numpy中reshape函数、reshape(1,-1)的含义(浅显易懂,源码实例)
  9. 8个程序员专用软件/网站,个个是神器,第一个最惊喜......
  10. 程序员长见识需要关注的牛人