当前位置: 首页 > news >正文

在嵌入式中C语言中static修饰的变量常量和字符串常量存储位置

在嵌入式系统的 C 语言编程里,static修饰的变量、常量以及字符串常量的存储位置,和硬件平台、编译器配置以及内存布局都有关系。下面进行详细分析:

1. 字符串常量

字符串常量会被存于程序的只读数据段(.rodata)。在嵌入式系统中,为了节省 RAM,这个段通常会被直接映射到 FLASH 中,并且在程序运行时保持只读状态。

const char* message = "Hello, World!"; // 字符串字面量存放在FLASH

2. static修饰的变量

  • 静态全局变量和静态局部变量
    要是它们已经初始化,就会存放在数据段(.data);若未初始化或者初始值为 0,则存放在 BSS 段(.bss)。在程序启动时,这些段会被加载到 RAM 中,而且在运行期间可以修改。

    static int counter = 10; // 存放在.data段(RAM)
    static int flags;        // 存放在.bss段(RAM)
    
  • static const变量
    当用const修饰时,变量会变为只读的。如果初始值是编译时常量,那么它会存放在只读数据段(.rodata),从而可能被映射到 FLASH。

    static const float PI = 3.14f; // 存放在.rodata段(可能在FLASH)
    

3. 普通常量(const

普通的const变量默认存放在只读数据段(.rodata),所以在嵌入式系统中通常会被映射到 FLASH。

const int MAX_VALUE = 100; // 存放在.rodata段(可能在FLASH)

4. 存储位置总结

类型存储段嵌入式系统中的位置
字符串常量.rodataFLASH
static变量(非const.data/.bssRAM
static const变量(编译时常量).rodataFLASH
普通const变量.rodataFLASH
static变量(初始值为非常量).dataRAM

5. 特殊情况说明

  • 初始化值为非常量
    如果static const变量的初始值不是编译时常量,编译器可能会把它放在 RAM 中。

    int get_value() { return 42; }
    static const int dynamic_value = get_value(); // 可能存放在RAM
    
  • 编译器优化
    编译器可能会对未被使用的常量进行优化,不会为它们分配存储空间。

6. 验证方法

你可以通过以下方式确认变量的存储位置:

  1. 查看链接器脚本(.ld文件),了解各个段被映射到了何处。
  2. 分析编译器生成的.map 文件,查找变量的地址。
  3. 利用调试器(如 GDB)查看变量的内存地址,判断是位于 FLASH 区域还是 RAM 区域。

7. 实际应用建议

  • 对于嵌入式系统,要把不变的数据(如配置表、查找表)定义为const,这样可以将其放在 FLASH 中,节省 RAM。
  • 若需要在运行时修改数据,即使使用了static修饰,也不要用const,因为这类数据需要存放在 RAM 中。

不同的编译器和硬件平台可能会有一些细微差别,所以在实际开发中,建议查看具体平台的文档和工具链手册,从而准确把握存储布局情况。

http://www.xdnf.cn/news/891379.html

相关文章:

  • 总结vxe-grid的一些用法
  • 精度分析方法-不确定度
  • [蓝桥杯]三体攻击
  • MySQL的并发事务问题及事务隔离级别
  • 12V降5V12A大功率WD5030A,充电器、便携式设备、网络及工业领域的理想选择
  • 大语言模型评测体系全解析(中篇):专项能力评测与行业垂直场景
  • Mysql莫名奇妙重启
  • 实现单例模式的常见方式
  • Redis Set集合命令、内部编码及应用场景(详细)
  • GC1809:高性能音频接收与转换芯片
  • Python Day42 学习(日志Day9复习)
  • AI智能推荐实战之RunnableParallel并行链
  • .Net Framework 4/C# System.IO 命名空间(文件的输入输出)
  • 深度学习之模型压缩三驾马车:基于ResNet18的模型剪枝实战(2)
  • 箭头函数和普通函数的this指向
  • BLE中心与外围设备MTU协商过程详解
  • 炫云:为驱动数字视觉产业升级保驾护航
  • 【设计模式-4.11】行为型——解释器模式
  • centos实现SSH远程登录
  • 分布式一致性原理及一致性协议
  • AI数字人小程序开发,重塑商业服务新模式
  • 6个月Python学习计划 Day 15 - 函数式编程、高阶函数、生成器/迭代器
  • 分析vban的utlis中的helper方法(1)——数组
  • 【技术笔记】AI Agent 项目 SUNA 部署:MSYS2 环境中 Python 版本从 3.12 降级至 3.11 的实操指南
  • place 布局管理器
  • java使用文本相似度检测可以调整阈值
  • Redis 配置与优化
  • LAUNCHXL-F28379D SCI中断配置
  • 什么是数据孤岛?如何实现从数据孤岛到数据共享?
  • java.io.IOException: Broken pipe