1. const 变量的存储位置
| 情况 | 存储位置 | 说明 | 
|---|---|---|
const 字符串字面量 | 
Flash(只读区) | 字符串常量直接存储于 Flash | 
const 全局或静态数组、变量 | 
Flash(只读区) | 直接放程序存储区,不占用 RAM | 
非 const 全局或静态变量 | 
RAM | 由启动代码拷贝初始化数据到 RAM | 
const 局部变量 | 
依编译器,通常 RAM | 局部变量在栈或静态区 | 
2. const char table[3] = {1, 2, 3}; 解析
table数组是只读数据 ,存储在 Flash(通常是.rodata段)- 运行时直接从 Flash 读取,不占用宝贵的 RAM 空间
 - 如果没有加 
const,则数据放 RAM,且启动时由启动代码复制初始化数据 
3. 变量存储示意
| 代码示例 | 变量类型 | 存储位置 | 
|---|---|---|
const char table[3] = {1,2,3}; | 
只读全局数组 | Flash (.rodata) | 
char table[3] = {1,2,3}; | 
普通全局数组 | RAM | 
"hello" | 
字符串字面量 | Flash | 
const char *p = "hello"; | 
指针变量放 RAM,字符串放 Flash | RAM (指针), Flash (字符串) | 
4. 优势
- 使用 
const关键字可以让数据直接放在 Flash,节省 RAM - RAM 是嵌入式系统中稀缺资源,尤其重要
 
5. 编译器和链接器细节
- 编译器根据 
const属性将数据放入.rodata段 - 链接器脚本把 
.rodata段放到 Flash 地址空间 - 启动代码不需要复制 
.rodata数据,因为直接在 Flash 读取 
6. 验证方法
- 查看生成的 
.map文件,确认table地址是否属于 Flash - 使用 
objdump或类似工具查看.rodata段内容 
7. 注意事项
const局部变量通常不放 Flash,而是在栈或静态区- 不同编译器对 
const的处理细节略有不同,但大体类似 - 在 STM32 工程中无需额外操作,使用 
const即可放心让数据放 Flash