STM32中堆栈的理解

关于程序的内存分配

  1. 栈区(stack):由编译器自动分配和释放,存放函数的参数与返回值、局部变量等。
  2. 堆区(heap):由程序员分配管理,一般未使用(malloc函数)。
  3. 全局区与静态区:存储全局变量和静态变量,其中初始化的全局变量和静态变量在一块区域,未初始化的全局变量和静态变量在相邻的另一块区域。
  4. 文字常量区:存放常量字符串。
  5. 程序代码区:存放程序代码。

栈区、堆区、全局区静态区存储在SRAM中,文字常量区和程序代码区存放在Flash中。通过Rebuild可以看出整个内存分配。

Code:存储代码

RO-data:存储const常量和指令

RW-data:存储初始化值不为0的全局变量、静态变量

ZI-data:存储初始化值为0的全局变量、静态变量

所以Flash = Code+RO-data+RW-data,SRAM = RW-data+ZI-data

在.map文件中也可以看见

47648 = 0xBA20,所以SP指针的栈顶地址是0x2000BA20。

打开.map文件可以查看程序的内存分配

0x20000000是sram开始的地址,可以看到各段的分布。

STACK:栈区

HEAP:堆区

.data:初始化的全局变量、静态变量

.bss:未初始化或者初始化为0的全局变量、静态变量

0x08000000是flash开始的地址,可以看到各段的分布。

.constdata:文字常量区

Code:函数代码

在Options for Target页面中可以设置Flash和SRAM大小:

我们只在启动文件中设置了栈区、堆区的大小,并未设置全局区的大小,如果有定义全局变量,则sram先给全局区分配内存,再给栈区分配内存(最后分配)。

从下图中可以看出,最后从0x2000aa20开始分配了0x1000大小的STACK栈空间。mallco.c中定义了一个大小40K的全局数组(未初始化),数组在内存的地址从0x20000020开始,大小为0xA000,再加上其他的未初始化全局数组就达到了0x2000aa20。

目前两种内存获取方式:

  1. 同庞大的全局变量数组来圈住一块内存,然后将这个内存拿来进行内存管理和分配。

  2. 把编译器未使用的RAM部分用于做内存分配,也就是除掉RW-data+ZI-data+编译器堆+编译器栈 后剩余的RAM内存中的一部分或者全部进行内存管理和分配。这种情况下需要知道内存剩下部分的首地址和内存的尾地址,然后要用多少内存,就从首地址开始挖,做一个链表,把内存获取和释放相关信息链接起来,就能及时的对内存进行管理了。

生长方向:

  • 堆:向上生长

  • 栈:向下生长

  • 数组:向上生长

定义在栈中的数组仍然是向上生长的,局部变量是从高地址开始往低地址存。

注意:局部变量用数组过大会导致栈溢出。

void test()
{u32 buff[] = {0x01234567,0x89abcdef};u32 *p = buff;printf("0x%x", *(u32*)((u8*)p+1));}

STM32中堆栈的理解相关推荐

  1. 再次理解STM32中的堆栈机制

    再次理解STM32中的堆栈机制 刚拿到STM32时,你只编写一个死循环 void main() { while(1); }BUILD://Program Size: Code=340 RO-data= ...

  2. 深入浅出地理解STM32中的中断系统——从原理到简单工程示例——保姆级教程

    深入浅出地理解STM32中的中断系统 一.什么是中断?什么是异常? 二.如何管理中断? 三.NVIC 1 NVIC 特点 2 中断优先级 (1) 优先级分组 3 中断向量表 4 中断服务函数 (1)中 ...

  3. 9.STM32中对SysTick_Init()函数(sysTick_Config()、TimingDelay_Decrement()自定义)和Delay_us()的理解

    STM32中对SysTick_Init()函数(sysTick_Config().TimingDelay_Decrement()自定义)和Delay_us()的理解: 实验:3个LED灯以500ms的 ...

  4. 8.STM32中对ADC1_Config()函数(ADC1_GPIO_Config()和ADC1_Mode_Config())的理解(自定义)测试ADC转换电压值输出到终端上。

    STM32中对ADC1_Config()函数(ADC1_GPIO_Config()和ADC1_Mode_Config())的理解:

  5. 7.STM32中对DMA_Config()函数的理解(自定义)测试DMA传输数据时CPU还可继续工作其他的事

    STM32中对DMA_Config()函数的理解(自定义):

  6. 4.STM32中对USART1_Config()函数的理解(自定义)

    STM32中对USART1_Config()函数的理解

  7. 3.STM32中对EXTI_PE5_Config()函数的理解(自定义)之中断控制按键LED

    STM32中对EXTI_PE5_Config()函数的理解(自定义)

  8. 2.STM32中对Key_GPIO_Config()函数的理解(自定义)之轮询控制按键LED

    STM32中对Key_GPIO_Config()函数的理解(自定义)

  9. 1.STM32中对LED_GPIO_Config()函数的理解(自定义)之流水灯

    STM32中对LED_GPIO_Config()函数的理解(自定义)

最新文章

  1. 表的插入、更新、删除、合并操作_11_更新表的记录
  2. 【maven】mvn -pl 指定模块
  3. Apache Flink 零基础入门(十三)Flink 计数器
  4. 39. Combination Sum 组合总和
  5. HH SaaS电商系统的支付模块设计
  6. nacos启动报错 db.num is null【已解决】
  7. 恒生电子软件工程师面试
  8. win7如何设置通电自动开机_电脑如何设置自动开机,教您如何设置
  9. 一款优秀的IT资产管理系统-Snipe-IT 安装及用户手册中文版(一安装部署篇)
  10. hadoop java 文件追加_HDFS追加文件
  11. 如何用python进行相关性分析_Python 数据相关性分析
  12. 多模态语义检索 | 基于 MetaSpore 快速部署 HuggingFace 预训练模型
  13. HDU 4911 Inversion - 疯狂的癫子 解题心得
  14. 宋宝华:为什么numactl内存绑定对代码段不起作用
  15. MySQL-SQL注入,导入,导出
  16. 网易云短信接口调入(java)
  17. 基于51单片机的秒表系统设计(源代码+Proteus仿真图)
  18. Unity2D入门(八):游戏场景中的UI(主菜单与暂停菜单)
  19. STM32F1 时钟学习
  20. 最佳开源应用程序:图形/图像处理软件

热门文章

  1. NanoHTTPD----SimpleWebServer处理请求过程
  2. 一、什么是Nginx? Nginx的作用是什么?
  3. Nginx主要用来干什么
  4. Unity3D Shader 入门
  5. android系统(148)---android 8.1关机闹钟
  6. 我希望我们在Java中拥有十大锡兰语言功能
  7. 科技人文丨爱上陌生人的36个问题
  8. 华侨大学计算机组成原理期末考试试题,计算机组成原理试卷A卷答案
  9. Python:素数求和
  10. python怎么打开qq_Python怎么登录QQ空间?