【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
相关推荐
心祭丫丫14 分钟前
【每天一个 Python 小案例17】Python 实现通讯录
开发语言·人工智能·笔记·python·学习
派大猩猩_2 小时前
Obsidian 笔记怎么同步多端:Nutstore Sync 大笔记库同步测评
笔记·obsidian·obsidian插件·obsidian同步
Nerd(BUG版)3 小时前
Flutter学习day5--事件手势与命中测试
学习·flutter
Nerd(BUG版)5 小时前
KMP学习day4--Kotlin空安全与泛型
学习·安全·kotlin
東隅已逝,桑榆非晚5 小时前
算法6. 双指针法-查找总价格为目标的两个商品
c++·学习·算法
wdyan2976 小时前
带着小白学习-微服务-5 实战:配置中心-数据库连接
数据库·学习·微服务
叼烟扛炮6 小时前
Linux 学习笔记(五十):网络层——IP 协议、子网划分与 NAT 魔法
linux·笔记·学习
Dev_XH6 小时前
【成品设计】基于物联网的车间安全生产监控系统设计
stm32·单片机·嵌入式硬件·物联网
叼烟扛炮7 小时前
Linux 学习笔记(六十):单线程的逆袭——epoll 高并发服务器实战
linux·服务器·网络·笔记·学习·算法
Rabitebla8 小时前
【Linux操作系统】进程篇(十一):进程程序替换——从底层原理到 exec 函数族
linux·服务器·c++·笔记·学习·算法