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

MCU程序段的分类

程序的下载(烧录到存储器中)通常是按照程序文件分段(Code段、RO_data段、RW_data段、ZI_data段)的方式存储的,但运行时内存的布局会按照程序进程分段(TEXT段、DATA段、BSS段、堆栈段)进行组织。以下是具体分析:


1. 下载时的存储方式(文件分段)

程序在编译链接后生成的二进制文件(如ELF、Hex、Bin等)是按文件分段存储的,主要包括:

  • Code段:存储机器指令(代码)。
  • RO_data段:存储只读常量(如字符串常量、const变量)。
  • RW_data段:存储已初始化且非零的全局/静态变量。
  • ZI_data段:存储未初始化或初始化为零的全局/静态变量(实际下载时可能不占用空间,仅记录大小)。

下载时的特点

  • 文件中的ZI_data段通常不会直接存储零值数据,而是通过链接脚本记录其大小,运行时由启动代码(如startup.s)在内存中初始化为零。
  • 下载到Flash/ROM时,仅包含CodeRO_dataRW_data的初始值,ZI_data仅保留大小信息。

2. 运行时的内存布局(进程分段)

程序运行时,会根据进程分段加载到内存中:

  • TEXT段:对应文件中的Code段RO_data段,通常加载到只读内存(如Flash或ROM)。
  • DATA段:对应文件中的RW_data段,需从Flash拷贝到可读写内存(如RAM),因为运行时可能需要修改这些变量。
  • BSS段:对应文件中的ZI_data段,由启动代码在RAM中初始化为零。
  • HEAPSTACK:在运行时动态分配,不占用下载文件空间。

关键区别

  • RW_data段在文件中存储初始值,但运行时需要复制到RAM的DATA段(因为Flash不可写)。
  • ZI_data段在文件中仅记录大小,运行时在RAM的BSS段中分配并清零。

3. 为什么下载按文件分段?

  • 存储效率:Flash/ROM空间有限,避免存储全零的ZI_data数据。
  • 执行效率:启动时只需从Flash中拷贝RW_data的初始值到RAM,并快速清零BSS段

4. 链接脚本的作用

链接脚本(如ld文件)会明确指定:

  • 哪些段属于Flash(CodeRO_dataRW_data的初始值)。
  • 哪些段属于RAM(RW_data的运行地址、BSS段的分配)。

示例链接脚本片段:

MEMORY {FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 256KRAM (rwx)  : ORIGIN = 0x20000000, LENGTH = 64K
}SECTIONS {.text : { *(.text*) } > FLASH      /* Code段 */.rodata : { *(.rodata*) } > FLASH  /* RO_data段 */.data : { *(.data*) } > RAM AT > FLASH  /* RW_data段:RAM中运行,Flash中存储初始值 */.bss : { *(.bss*) } > RAM         /* ZI_data段 */
}

5. 总结

  • 下载时:按文件分段(Code、RO_data、RW_data、ZI_data)存储到Flash/ROM。
  • 运行时:按进程分段(TEXT、DATA、BSS、堆栈)组织内存,其中RW_dataZI_data需从Flash初始化到RAM。

这种设计平衡了存储空间和运行时效率,是嵌入式系统和裸机程序的典型实现方式。

http://www.dtcms.com/a/317132.html

相关文章:

  • 异世界历险之数据结构世界(非递归快排,归并排序(递归,非递归))
  • 搭建私有 Linux 镜像仓库
  • 算法训练营DAY55 第十一章:图论part05
  • 图论(邻接表)DFS
  • 藏文识别技术:为藏文化的保护、传播、研究与发展注入核心动力
  • 【C++基础】宏的高级替代方案:面试高频考点 + 真题解析全攻略
  • 推荐系统召回粗排的优化思路
  • 数据大集网:以数据为纽带,重构企业贷获客生态的助贷平台实践
  • 【WAIC 2025】AI安全的攻防前线:合合信息AI鉴伪检测技术
  • 基于Vue+Node.js(Express)实现(Web)物联网的蔬菜大棚温湿度监控系统
  • Google地图的“网络定位”功能
  • 中国移动h10g-01_S905L处理器安卓7.1当贝纯净版线刷机包带root权限_融合终端网关
  • Spring Boot 参数校验全指南
  • 学习日志29 python
  • 猫头虎AI分享:Claude Opus 新版 4.1 在 SWE-bench Verified 上准确率达到了 74.5%,在多文件代码重构方面表现突出
  • 力扣经典算法篇-44-组合总和(回溯问题)
  • Qt菜单栏与工具栏实战
  • Linux86 sheel流程控制前瞻4 判断vsftpd服务启动,如果启动,打印端口号,进程id
  • 基于FFmpeg和HLS的大文件分片传输方案
  • SRS简介及简单demo
  • 豆包新模型与PromptPilot工具深度测评:AI应用开发的全流程突破
  • 神经网络搭建对CIFAR10数据集分类
  • 生成式AI如何颠覆我们的工作和生活
  • 深度学习(pytorch版)前言:环境安装和书籍框架介绍
  • 【Canvas与三角形】黑底回环金片三角形
  • 如何解决网页视频课程进度条禁止拖动?
  • DHCP 服务器与DNS服务器
  • QML开发:QML中的基本元素
  • JAVA高级编程第六章
  • 深入解析Java NIO在高并发场景下的性能优化实践指南