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

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.xdnf.cn/news/17294.html

相关文章:

  • http请求结构体解析
  • 【注意】HCIE-Datacom华为数通考试,第四季度将变题!
  • 时隔六年!OpenAI 首发 GPT-OSS 120B / 20B 开源模型:性能、安全与授权细节全解
  • Spring Boot部门管理系统:查询、删除、新增实战
  • 嵌入式处理器指令系统:精简指令集RISC与复杂指令集CISC的简介,及区别
  • 数据结构学习(days04)
  • Node.js- express的基本使用
  • 嵌入式学习---在 Linux 下的 C 语言学习 Day9
  • 《第五篇》基于RapidOCR的图片和PDF文档加载器实现详解
  • 基于单片机GD32E103的HID按键问题分析
  • 日常反思总结
  • electron:vue3+vite打包案例
  • Spring Cloud系列—Eureka服务注册/发现
  • CSS高频属性速查指南
  • 【普通地质学】地球的物质组成
  • Windows 如何上架 iOS 应用?签名上传全流程 + 工具推荐
  • LeetCode——118. 杨辉三角
  • 【Git】修改本地和远程的分支名称
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘chainer’问题
  • 基于AI的自动驾驶汽车(AI-AV)网络安全威胁缓解框架
  • Adobe Analytics 数据分析平台|全渠道客户行为分析与体验优化
  • 【第5话:相机模型1】针孔相机、鱼眼相机模型的介绍及其在自动驾驶中的作用及使用方法
  • 开源流媒体服务器ZLMediaKit 的Java Api实现的Java版ZLMediaKit流媒体服务器-二开视频对话
  • 【java】DDD架构同普通微服务项目的区别
  • DAY 36 复习日
  • MinIO01-入门
  • ara::log::LogStream::WithTag的概念和使用案例
  • Patsy的dmatrix() 函数
  • 利用m0改造循迹模块处理笔记00
  • 智慧酒店:科技赋能下的未来住宿新体验