代码段/数据段/堆栈的内存分配和STM32的编译信息分析

1. 二进制(汇编)代码的内存分配

  • CODE-text section(代码段、正文段 )
    程序中出现的字符串,函数(里面的局部变量在栈区),通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读, 某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。
  • RO-data section(只读数据段)
    有的人把这归属到代码段中,或者数据段中
  • RW-data section(数据段 )
    初始化了的全局变量(初始化为0)、静态局部变量(static),属于静态内存分配。
  • ZI-bss 段
    未初始化的数据段或者叫bss,属于静态内存分配。
  • stack section(栈)
    局部变量的空间在栈(栈帧)里分配,初始化是随机的,所以最好要初始化

  • malloc分配的内存 、 new分配的内存 ,属于动态分配

      典型的存储空间安排如下:
在这里插入图片描述

2. STM32编译信息分析

● 芯片手册中 Flash 和 RASM 的限制

单片机如何选型,在功能外设都满足的情况下,如何给老板省成本,其中存储够不够是关键, 比如在STM32F070F6芯片中,Flash 不能超过32K,SRAM不超过 6K。
在这里插入图片描述
● 程序编译后的输出信息
在这里插入图片描述
Code、RO-data、RW-data上文都介绍了,ZI-data = ZI-bss 段 + 堆
其中FALSH和RAM的占用情况,如下:

Code + RO-data = 9776 + 240 :程序占用FLASH的大小 RO Size
Code + RO-data + RW-data = 9776 + 240 + 500 :烧录时程序占用FLASH的大小 ROM
RW-data + ZI-data = 500 + 5172 :运行时程序占用RAM的大小 RW Size

● 内存精简

内存只有那么点大?代码难得改? 上面的RAM马上就要超过6K的限制,根据前面可知:
RAM = RW-data + ZI-data = RW-data + ZI-bss 段 + 堆 = 全局变量/静态局部变量 (包括未初始化的) + 堆。
介绍一个常见的精简RAM的方法,可以在启动文件中降低堆的配置,如下Heap_Size = 0x100
在这里插入图片描述
编译信息如下:
在这里插入图片描述
减少堆大小,Heap_Size = 0x080
在这里插入图片描述
编译信息如下,就ZI-data 减少了 5300-5172 = 128字节 = 0x80,没毛病验证也正确。在这里插入图片描述
当然不同的优化等级编译的输出信息也不尽相同,上面的Level 0(-O0)最低的优化等级,下面是Level 3(-O3)的深度优化后:
在这里插入图片描述
可以看出FLASH和SRAM都大大减少了,但是程序没写好的话,很有可能进入莫名的BUG,具体优化了什么,如下 (摘自 MDK优化等级设置) :
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_16504163/article/details/108420792