【STM32】const 变量存储学习笔记
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