1. 单片机C程序内存分布全景解析
作为一名在嵌入式领域摸爬滚打多年的工程师,我经常遇到新手对单片机内存布局的困惑。与PC环境不同,单片机资源极其有限,理解内存分布对优化程序至关重要。让我们先看一个典型STM32项目在Keil环境下的内存映射:
code复制0x08000000 ┌──────────────┐
│ Code │ 机器指令
├──────────────┤
│ RO-data │ 常量/const全局变量
├──────────────┤
│ RW-data │ 初始化非零全局变量
└──────────────┘
0x20000000 ┌──────────────┐
│ RW-data │ 从Flash加载的初始化数据
├──────────────┤
│ ZI-data │ 零初始化数据/BSS段
├──────────────┤
│ Heap │ 动态内存区
├──────────────┤
│ Stack │ 栈区(向下增长)
└──────────────┘
关键理解:单片机上电时,RW-data会从Flash复制到RAM,而代码直接在Flash(ROM)中执行,这是与PC程序最大的不同
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 各内存段深度剖析
2.1 代码段(Code/Text)特性
在Keil编译的.map文件中,Code段包含:
- 所有函数编译后的机器指令
- 跳转表/中断向量表
- 宏定义展开后的常量值
实测案例:在STM32F103上,一个简单的GPIO控制函数会生成约20字节的机器码。通过反汇编可以看到:
assembly复制0x08000100: B480 PUSH {r7}
0x08000102: AF00 ADD r7, sp, #0
0x08000104: 4B05
