嵌入式基础–代码和数据空间的神秘化

在为资源受限的系统开发软件时,强烈建议开发人员使用跟踪代码,数据和RAM使用情况的指标。始终可以在编译器生成的地图文件中找到此信息,但不一定总是最终值和总值。许多编译器会在编译过程中计算这些值并将其打印到控制台窗口。尽管显示的信息并不总是很清楚。

例如,当为ARM Cortex-M处理器编译程序时,打印到控制台的输出将采用类似于以下形式:

文本数据bss dec十六进制文件名

0x100 0x22 0x56 377 0x178实验1.elf

乍一看,这看起来可能比较吓人,尽管并非完全如此。我想到的问题是这些不同的空间到底意味着什么?实际使用了多少RAM和多少FLASH?要了解这一点,至关重要的是要知道这些细分的确切含义以及它们如何对这些总计做出贡献。

文本段告诉开发人员为程序的代码和常量分配了多少闪存空间。可以将其视为使用const类型限定符,函数和作为程序一部分生成的可执行代码的任何变量。例如,以下语句将四个字节添加到文本段。

const uint32_t数据= 0x14;

数据段包含初始化变量在闪存中占用的空间量。本节很重要,因为变量的初始化值存储在闪存中,但是在系统初始化期间将它们复制到RAM中。此复制过程通常称为C复制。初始化变量的示例可以在下面找到:

uint32_t Data_Init = 0x14;

bss段包含任何未初始化数据的空间。这些数据的初始值为0。这些变量再次存储在RAM中。一个未初始化数据的简单示例如下:

uint32_t Data_NoInit;

编译器输出中的其余值仅用十进制或十六进制表示文本,数据和bss段的总数。不幸的是,这个结果实际上只能告诉应用程序将使用多少闪存空间。为了获得正在使用的RAM数量,需要将数据段和bss段加在一起。完成此操作后,开发人员可以了解零件上正在使用多少闪存和RAM空间。

发表评论

您的电子邮件地址不会被公开。 必需的地方已做标记 *

该网站使用Akismet减少垃圾邮件。 了解如何处理您的评论数据.