stm32的flash和ram占用情况
在stm32中flash就是ROM,掉电数据不会丢失;(通常保存着text段、Code、Ro-data、Rw-data)
RAM就是运行内存,掉电数据就丢失;(通常保存着堆、栈、bss段、data段、ZI-data、RW-data)
编译生成的主要有代码区、只读数据区、读写数据区、初始化值为0数据区。FLASH由代码区、只读数据区 和 读写数据区占用。RAM由读写数据区 和 初始化值为0 的数据区占用。
KEIL5 编译结果分析
在keil中编译结果如下图:
打开生成的map文件拉到最后可看到如下:
编译结果里面几个的含义
Code:代码空间,本质是ARM指令( FLASH)。
RO-data:即 Read Only-data, 表示程序定义的常量,如 const 类型( FLASH)。
RW-data:即 Read Write-data, 非0初始化的全局和静态变量占用的RAM大小,同时还要占用等量的ROM大小用于存放这些非0变量的初值(FLASH+RAM)。
ZI-data:即 Zero Init-data, 0初始化的内存区的大小(该区域3个用途:0初始化的全局和静态变量+堆区+栈区)(RAM)。
由上可知:
程序占用FLASH=Code + RO-data + RW-data 即map文件中ROM size
程序占用RAM = RW-data + ZI-data 即map文件中RW size
RW-data为什么会即占用Flash又占用RAM空间?
由前文知道RAM掉电数据会丢失,RW-data是非0初始化的数据,已初始化的数据需要被存储在掉电不会丢失的FLASH中,上电后会从FLASH搬移到RAM中。
我们都知道在烧写程序的时候,需要烧写bin文件或者hex文件到STM32的flash中,被烧写的文件称为映像文件image。image的内容包含这三个Code 、 RO-data 和 RW-data。
为什么不包含ZI-data呢?通过上一个问题大家可能应该理解了,因为ZI数据是0,没必要包含,只要在程序运行前把ZI数据区域一律清零即可,包含进去反而浪费Flash存储空间。
型号 | FLASH(KB) | RAM(KB) | FOOTPRINT |
---|---|---|---|
GD32F105RBT6 | 128 | 64 | LQFP64 |
VSCODE 编译 text data bss dec 字段含义
text:代码段,存储在FLASH中
data:初始化数据 数据段
bss:未初始化数据 数据段
dec = text + data + bss