STM32 程序内存分布详解

1. STM32 内存的逻辑分布

从高地址到低地址,程序运行时的内存布局一般可以划分为如下区域:

2. 各存储区详解

(1) 栈区(Stack)

  • 用于存放局部变量函数形参返回值

  • 特点是 先进后出(FILO),函数调用时自动开辟,函数返回后自动释放。

  • 例如:

    int Demo(int x) {
    int y = 5; // y 在栈区
    return x + y;
    }

(2) 堆区(Heap)

  • 程序运行时通过 malloc/new 动态申请的内存块存放于堆区。

  • 堆内存不会自动释放,需手动调用 free/delete 否则可能造成内存泄漏

  • 例如:

    void *p = malloc(20); // p指针本身在栈,分配的20字节在堆
    free(p);

(3) 全局/静态区

由两部分组成:

  • .bss 段 :存放未初始化的全局变量、初始化为 0 的全局/静态变量。该区域在程序启动时由系统自动清零,不占用可执行文件大小。
  • .data 段存放已初始化的全局变量和静态变量,占用可执行文件空间。

(4) 常量区(.rodata)

  • 存放 const 全局变量、字符串常量等。
  • 该区域内容只读,不允许修改。

(5) 代码区(.text)

  • 存放编译生成的程序指令。
  • 在 STM32 中,通常位于 Flash 存储器中。

3. 示例程序解析

来看一个示例:

复制代码
static  unsignedint val1 = 1;    // .data 段
unsigned int val2 = 1;           // .data 段
unsigned int val3;               // .bss 段
const unsigned int val4 = 1;     // .常量区 段

unsigned charDemo(unsignedint num) {
  char var[] = "123456";       // var 数组在栈,字符串常量在.rodata
  unsigned int num1 = 1;       // 栈区
  static unsigned int num2 = 0;// .data 段
  const unsigned int num3 = 7; // 栈区
  void *p = malloc(8);         // 堆区
  free (p);
  return 1;
}
int main(void) {
  unsigned int num = 0;        // 栈区
    num = Demo(num);             // 返回值在栈区
}

通过该例子,可以直观理解不同修饰符与变量的存储区域。


4. 存储介质的差异

(1) RAM

  • 随机存取存储器,断电数据丢失。
  • STM32 内部的 SRAM 用于存放运行时数据(栈、堆、全局区等)。

(2) ROM

  • 只读存储器,通常在出厂时就写入程序,几乎无法修改。

(3) Flash Memory

  • 现代 MCU 常用的程序存储介质,掉电数据不丢失。
  • STM32 的程序代码和常量就存放在 Flash 中。

总结:

  • RAM:栈区、堆区、.data、.bss
  • Flash:代码区、常量区(rodata)

5. Keil 编译输出分析

在 Keil 的 Build Output 窗口中,我们常见到如下统计信息:

复制代码
Code    : 程序代码大小
RO-data : 只读数据(常量、字符串)
RW-data : 已初始化的可读写数据(.data)
ZI-data : 未初始化数据(.bss)

由此可以计算出 RAM 和 ROM 的占用情况:

  • ROM 占用 = Code + RO-data + RW-data
  • RAM 占用 = RW-data + ZI-data

这对于开发过程中评估内存使用、优化代码结构非常关键。

相关推荐
玩转单片机与嵌入式7 小时前
深入浅出TinyML 16:FFT、频带能量和MFCC分别适合什么任务?
stm32·深度学习·tinyml
深圳市宝华视联14 小时前
Python 读取 IP 视频流简单 Demo
python·嵌入式硬件·opencv·网络协议·tcp/ip·实时音视频·嵌入式实时数据库
恒锐丰科技韩生14 小时前
RB6005A|晶准 单节锂电池内置 MOS 保护芯片 DFN2×3‑8
嵌入式硬件·硬件工程
youshi666815 小时前
stm32-PWR、低功耗模式
stm32·单片机·嵌入式硬件
ACP广源盛1392462567315 小时前
Qwen3.8‑2.4T 开源落地@ACP#国产 Serdes 长距离视频传输芯片 GSV5800 在私有化 AI 服务中的价值与应用场景
大数据·数据库·人工智能·嵌入式硬件·矩阵·开源·音视频
Funing715 小时前
STM32 电机动态 PI 控制:从编码器反馈、增量式 PI 到 Matlab 参数拟合与 PWM 输出
stm32·嵌入式硬件·matlab·pi控制算法
云泽80816 小时前
深入浅出 STM32(十八):时钟树、总线与寄存器的底层联动机制
stm32·单片机·嵌入式硬件
米饭不加菜16 小时前
C51 语言参考手册
经验分享·笔记·单片机·嵌入式硬件
深圳市宝华视联17 小时前
院感约束下,手术室音视频布线与设备摆放实施注意事项
嵌入式硬件·音视频·实时音视频·视频编解码·嵌入式实时数据库
科芯创展17 小时前
2.7VIN,5VOUT,360KHz,电荷泵升压芯片,XZ3120
单片机