之前在裸机跑一些简单的项目内存完全够用,就不会涉及到内存方面的问题。最近在学 FreeRTOS 时,将大容量的 stm32f103rct6 代码移植到 小容量的 stm32f103c8t6 上时,就遇到了内存不足的问题,所以才注意到这些东西。
那么在我们编译后看到的这些东西到底代表着什么呢?在此之前我们先了解一下 Flash 和 SRAM。
一、认识 Flash 和 SRAM
打开 stm32f103rct6 的手册我们可以看到这个东西:Flash = 256K; SRAM = 48K;
在STM32微控制器中,Flash和SRAM是两种不同的存储器类型。
Flash是一种非易失性存储器,用于存储程序代码和只读数据。它具有较大的存储容量,可以保存微控制器的固件程序,包括操作系统、应用程序以及其他必要的程序代码。Flash存储器在断电后仍然可以保持数据内容,因此适用于存储长期不变的数据。
SRAM是一种易失性存储器,用于存储临时数据和变量。它具有较小的存储容量,但读写速度非常快。SRAM存储器通常用于存储程序运行时的变量、栈和堆等数据。与Flash不同,SRAM存储器在断电后会丢失数据,因此不适合存储长期使用的数据。
二、认识 Code、RO-data、RW-data、ZI-data
在STM32微控制器中,Code、RO-data、RW-data 和 ZI-data 是不同类型的存储区域。
1. Code(代码区):这个区域存储着程序的指令。这些指令一般是只读的,因此在运行时无法修改。它通常包含了程序的主要逻辑,例如函数、循环和条件语句等。Code区域通常是存储在闪存(Flash)中,可以通过编程器将程序代码烧录进去。
2. RO-data(只读数据区):这个区域存储着程序的只读数据,例如常量、字符串和只读变量等。与Code区域类似,RO-data区域也是只读的,无法在运行时修改。RO-data区域通常也存储在闪存(Flash)中,与Code区域相邻。
3. RW-data(读写数据区):这个区域存储着程序的读写数据,例如全局变量和静态变量等。RW-data区域可在程序运行时进行读取和写入操作。RW-data区域通常存储在内部静态随机存储器(SRAM)中,有较快的读写速度。
4. ZI-data(零初始化数据区):这个区域存储着程序的未初始化的全局变量和静态变量等。ZI-data区域在程序开始执行之前会被自动初始化为零。与RW-data区域类似,ZI-data区域也存储在内部静态随机存储器(SRAM)中。
2024 年 10 月 17 号更新
Code 区其实就是操作系统中的 .text 区
RO-data 区其实就是 .rodata
RW-data 区其实就是 .data
ZI-data 区其实就是 .bss
三、查看程序占用内存情况
综上所述,在编译成功后下面出现的信息 Program Size: Code=42284 RO-data=2696 RW-data=4592 ZI-data=15480 代表了程序的各个模块实际占用内存的大小。如果要查看程序占用芯片 Flash 和 SRAM 的大小,可以通过下面两种方式:
1、就是通过编译完成后下面的信息:
Program Size: Code=42284 RO-data=2696 RW-data=4592 ZI-data=15480
Flash = Code + RO-data;
SRAM = RW-data + ZI-data;
2、可以通过查看map文件来得到程序占用内存的详细信息:
如图双击项目文件 FreeRTOS 即可弹出 map 文件。
在 map 文件中找到最底端的数据:
其中 RO 表示程序占用 Flash 大小,RW 表示程序占用 SRAM 大小。因为 stm32f103c8t6 的参数 Flash = 64K; SRAM = 20K,显然内存够用。