云社区 博客 博客详情
云社区 博客 博客详情

《嵌入式实时操作系统:RT-Thread设计与实现》 —3.3 RT-Thread程序内存分布

华章计算机 发表于 2019-11-24 11:15:38 11-24 11:15
华章计算机 发表于 2019-11-24 11:15:38 2019/11/24
0
0

【摘要】 本节书摘来自华章计算机《嵌入式实时操作系统:RT-Thread设计与实现》一书中第3章,第3.3节,作者是邱祎 熊谱翔 朱天龙 。

3.3 RT-Thread程序内存分布

一般MCU包含的存储空间有片内Flash与片内RAM,RAM相当于内存,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-data:0数据段,存放未初始化的全局变量及初始化为0的变量。

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

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段中。


登录后可下载附件,请登录或者注册

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:huaweicloud.bbs@huawei.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
评论文章 //点赞 收藏 0
点赞
分享文章到微博
分享文章到朋友圈

评论 (0)


0/1000
评论

登录后可评论,请 登录注册

评论

您还没有写博客的权限!

温馨提示

您确认删除评论吗?

确定
取消
温馨提示

您确认删除评论吗?

删除操作无法恢复,请谨慎操作。

确定
取消
温馨提示

您确认删除博客吗?

确定
取消

确认删除

您确认删除博客吗?

确认删除

您确认删除评论吗?

温馨提示

登录超时或用户已下线,请重新登录!!!

确定
取消