用j2ee作的网站,番禺建设网站公司,wordpress模板中国风,手机单页网站制作1、RO Size、RW Size、ROM Size分别是什么
首先将map文件翻到最下面#xff0c;可以看到 1.1 RO Size#xff1a;只读段
Code#xff1a;程序的代码部分#xff08;也就是 .text 段#xff09;#xff0c;它存放了程序的指令和可执行代码。
RO Data#xff1a;只读…1、RO Size、RW Size、ROM Size分别是什么
首先将map文件翻到最下面可以看到 1.1 RO Size只读段
Code程序的代码部分也就是 .text 段它存放了程序的指令和可执行代码。
RO Data只读数据段也就是 .rodata 段它存放的是程序中的只读常量和字符串字面量等。
1.2 RW Size可读写数据段
RW Data已初始化的全局变量和静态变量即 .data 段这些数据会从 Flash/ROM 中拷贝到 SRAM 中并且可以在程序运行时被修改。
ZI Data未初始化的全局变量和静态变量即 .bss 段它们在程序启动时会被自动初始化为零并存储在 SRAM 中但不会占用 Flash/ROM 空间。
1.3 ROM Size整个程序需要占用的ROM 总大小
Code程序的代码.text 段。
RO Data只读数据.rodata 段。
RW Data已初始化的读写数据.data 段虽然这些数据在运行时会被拷贝到 SRAM 中但它们的初始值是存储在 ROMFlash中的。
1.4 总结
所以下载程序到 FLASH/ROM 时空间大小为Code RO Data RW Data
程序运行的时RAM使用的空间大小为RW Data ZI Data
2、为什么RW Data需要存储在ROM中ZI Data不需要 在上面我们可以看到RW Data 与 ZI Data 都会被拷贝到RAM中那么为什么 RW Data 需要存储在 ROM 中ZI Data 不需要呢
2.1 RW Data需要存储在ROM中 RW Data 包括全局和静态变量这些变量在程序中已经明确地赋予了初始值这些变量在程序启动时需要被初始化为它们在代码中定义的初始值。在程序开始运行之前变量的初始值必须从某个地方获取并被放置在 RAM 中因为在程序运行时这些变量可能会被修改因此需要位于 RAM 中。这就引出了一个问题这些初始值在程序启动之前需要存储在哪里 这些变量的初始值必须存储在某个地方以便在程序启动时能够被正确加载到 RAM 中。这些初始值需要在编译时确定并且在程序的整个生命周期内保持不变。 因为 RAM 是易失性的断电后会丢失数据所以这些变量的初始值在程序启动之前必须被保存在一个非易失性的存储器中这就是 ROM如 Flash。在程序启动时启动代码会从 ROM 中将这些初始值复制到 RAM 中相应的变量位置。
2.2 为什么ZI Data不需要存储在ROM中 C/C 语言规范规定未初始化的全局变量和静态变量在程序启动时会自动被设置为零。对于这些变量程序不需要存储它们的初始值因为它们的初始状态始终是零。 由于这些变量在启动时都会被自动初始化为零所以它们的初始值不需要存储在 ROM 中。启动代码会在程序开始运行时自动将这些变量所在的内存区域清零这个过程不需要依赖 ROM 中的任何数据。
2.3 总结
RW Data包含有初始值的全局和静态变量。因为这些初始值必须在程序启动时恢复因此它们的初始值需要存储在 ROM 中以便启动时能将这些初始值复制到 RAM 中。
ZI Data包含未初始化的全局和静态变量。由于它们的初始值始终是零启动时只需清零 RAM 中相应的内存区域因此它们的初始值不需要存储在 ROM 中。
3、Symbol Table Symbol Table 是程序链接阶段生成的一张表包含了程序中每个符号变量、函数、常量等的元数据信息。这些符号在程序执行过程中可能是代码、数据或常量它们分别存储在不同的段如 .text、.data、.bss中。map 文件中的符号表详细列出了这些符号的内存位置、大小及相关信息。
4、Removing Unused input sections from the image. 这是编译器和链接器在生成最终镜像时的一项优化措施。它会分析代码移除未被使用的函数、变量、或者其他输入段以减小最终生成的可执行文件的大小。这对于嵌入式系统非常重要因为内存资源通常很有限。可以在图中看到GPIO_EXTILineConfig配置外部中断EXTI线的函数段被移除了大小为64 bytes。