IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> keil 编译完 Program Size: Code RO-data RW-data ZI-data 的含义 -> 正文阅读

[嵌入式]keil 编译完 Program Size: Code RO-data RW-data ZI-data 的含义

声明:摘自嵌入式实时操作系统RT-Thread设计与实现中3.3小节(作者:邱祎 熊谱翔 朱天龙)

Code,RO-data,RW-data,ZI-data 的含义

一般MCU包含的存储空间有片内Flash与片内RAMRAM相当于内存Flash相当于硬盘。编译器会将一个程序分类为好几个部分,分别存储在MCU不同的存储区。
Keil工程在编译完之后,会有相应的程序所占用的空间提示信息,如下所示:

linking...
Program Size: Code=48008 RO-data=5660 RW-data=604 ZI-data=2124
After Build - User command #1: fromelf --bin .\build\rtthread-stm32.axf --output rtthread.bin
".\build\rtthread-stm32.axf" - 0 Error(s), 0 Warning(s).
Build Time Elapsed:  00:00:07

上面提到的Program Size包含以下几个部分。
(1)Code代码段,存放程序的代码部分。
(2)RO-data只读数据段,存放程序中定义的常量。
(3)RW-data读写数据段,存放初始化为非0值的全局变量。
(4)ZI-data0数据段,存放未初始化的全局变量及初始化为0的变量。

所占Flash和RAM的大小计算

编译完工程后会生成一个.map(在Listings目录下面)文件,该文件说明了各个函数占用的尺寸和地址,在该文件的最后几行也说明了上面几个字段的关系:

Total RO  Size (Code + RO Data)                53668 (  52.41kB)
Total RW  Size (RW Data + ZI Data)              2728 (   2.66kB)
Total ROM Size (Code + RO Data + RW Data)      53780 (  52.52kB)

(1)RO Size包含了Code及RO-data,表示程序占用Flash空间的大小;
(2)RW Size包含了RW-data及ZI-data,表示运行时占用的RAM的大小;
(3)ROM Size包含了Code、RO Data以及RW Data,表示烧写程序所占用的Flash空间的大小。

程序烧录到芯片后的内存分布

程序运行前

程序运行之前,需要有文件实体被烧录到STM32的Flash中,一般是bin或者hex文件,该被烧录文件称为可执行映像文件。图3-3中左图是可执行映像文件烧录到STM32后的内存分布,它包含RO段和RW段两个部分:其中RO段中保存了Code、RO-data的数据,RW段中保存了RW-data的数据,由于ZI-data都是0,所以未包含在映像文件中。
在这里插入图片描述
图3-3 RT-Thread内存分布

程序运行时

STM32在上电启动之后默认从Flash启动,启动之后会将RW段中的RW-data(初始化的全局变量)搬运到RAM中,但不会搬运RO段,即CPU的执行代码从Flash中读取,另外根据编译器给出的ZI地址和大小分配出ZI段,并将这块RAM区域清零。
其中动态内存堆为未使用的RAM空间,应用程序申请和释放的内存块都来自该空间。
如下面的例子所示:

rt_uint8_t* msg_ptr;
msg_ptr = (rt_uint8_t*) rt_malloc (128);
rt_memset(msg_ptr, 0, 128);

代码中的msg_ptr指针指向的128字节内存空间位于动态内存堆空间中。
而一些全局变量则存放于RW段和ZI段中,RW段存放的是具有初始值的全局变量(而常量形式全局变量则放置在RO段中,是只读属性的),ZI段存放的系统未初始化的全局变量,如下面的例子所示:

#include <rtthread.h>
const static rt_uint32_t sensor_enable = 0x000000FE;
rt_uint32_t sensor_value;
rt_bool_t sensor_inited = RT_FALSE;
void sensor_init()
{
    /* ... */
}

sensor_value存放在ZI段中,系统启动后会自动初始化为零(由用户程序或编译器提供的一些库函数初始化为零)。sensor_inited变量则存放在RW段中,而sensor_enable存放在RO段中。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-09-29 10:27:52  更:2021-09-29 10:28:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 2:43:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码