单片机内存在C 语言编译后的 “逻辑分区”

一、单片机内存两大物理大类

1. Flash(程序存储器 / ROM 类)

  • 掉电不丢数据
  • 存放:程序代码 + 常量
  • 速度:比 RAM 慢,擦写次数有限(几万~几十万次)

2. RAM(数据存储器,一般是 SRAM)

  • 掉电数据全丢
  • 存放:运行时变量、堆栈、临时数据
  • 速度:快,可频繁读写

一句话:代码常量在 Flash,变量运行在 RAM


二、C 语言编译后,内存的 "逻辑分区"

不管是 STM32、GD32、ESP32,编译后都分成这几个段(Section)

1. .text 段(代码区)

  • 位置:Flash
  • 内容:所有函数的机器指令(main、中断服务函数、子函数...)
  • 属性:只读,不可改

2. .rodata 段(只读常量区)

  • 位置:Flash
  • 内容:
    • const 全局常量
    • 字符串常量("hello"
  • 属性:只读,运行时不能写

3. .data 段(已初始化全局变量区)

  • 位置:运行时在 RAM

  • 内容:全局 / 静态变量,且初始值非 0

    int g_val=100; // 进入 .data

  • 启动时:Flash 里的初始值会复制到 RAM

4. .bss 段(未初始化 / 零初始化全局变量区)

  • 位置:RAM

  • 内容:

    int g_buf[1024]; // 默认0,进 .bss
    static int s_cnt; // 也是 .bss

  • 特点:不占 Flash ,启动时由代码自动清零

5. 栈(Stack)

  • 位置:RAM
  • 内容:
    • 局部变量
    • 函数参数
    • 函数返回地址、中断现场
  • 管理:自动分配 / 自动释放,大小固定(如 8KB),溢出会死机

6. 堆(Heap)

  • 位置:RAM
  • 内容:malloc/free 动态申请的内存
  • 管理:手动申请、手动释放;不释放会内存泄漏

三、一张表

段名 物理位置 存放内容 读写 掉电
.text Flash 程序代码 只读 不丢
.rodata Flash 常量、字符串 只读 不丢
.data RAM(来自 Flash 拷贝) 非 0 初始化全局变量 可读可写 丢失
.bss RAM 未初始化 / 零全局变量 可读可写 丢失
Stack RAM 局部变量、函数调用 读写 丢失
Heap RAM 动态内存(malloc) 读写 丢失

四、32 位单片机内存布局

复制代码
Flash 空间(从低到高)
├── .text      代码
└── .rodata    常量

RAM 空间(从低到高)
├── .data      已初始化全局变量
├── .bss       零初始化全局变量
├── Heap       堆(向上生长)
└── Stack      栈(向下生长,顶在高地址
相关推荐
洪核单片机5 小时前
DPJ-96基于STM32单片机wifi远程监控智慧教室 温湿度光照粉尘人数考勤
stm32·单片机·嵌入式硬件·智慧教室·教室人数考勤
m0_752753126 小时前
单片机基础知识
单片机·51单片机
天空'之城6 小时前
单片机基础核心知识点汇总(三十六)
单片机·嵌入式硬件
云泽8087 小时前
STM32 USART 详解(八):C I/O 串口重定向原理与实现
c语言·stm32·嵌入式硬件
ThornArmor7 小时前
重铸1996|肉体渲染:关节的裂缝:分段模型积木拼装与未成熟的 RSP 矩阵骨骼动画形变
c语言·汇编·c++·python·硬件架构·游戏机
T1mzhou7 小时前
ARM64 Linux 6.10 内核驱动(12):dd.c:probe/ remove、延迟 probe
linux·服务器·c语言·arm开发·arm
白色的北极熊9 小时前
c语言 scanf 输入流有空格,逗号 说明
c语言
Logic1019 小时前
C语言/数据结构位运算题解:异或XOR找出货船中的“独特载货量“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
JNX_SEMI12 小时前
OC5138T 8V~100V超宽输入降压恒流驱动:覆盖12V汽车至72V电动车全场景
单片机·嵌入式硬件
xx~t13 小时前
嵌入式——51单片机3
linux·c语言·嵌入式硬件·51单片机