繁体   English   中英

确定嵌入式C程序的总内存使用量

[英]Determine total memory usage of embedded C program

我希望能够调试C程序在256 KB内存的有限资源环境中使用多少总内存(目前我正在模拟器程序中进行测试)。

我有能力将调试语句打印到屏幕上,但我应该使用什么方法来计算我的C程序使用了多少(包括全局变量,局部变量[从我的主函数循环的角度来看],程序代码本身等等。 )?

第二个方面是显示特定变量的位置/范围,而不仅仅是它们的大小。

-Edit- CPU是Hitachi SH2,我没有让我把断点放到程序中的IDE。

使用IDE选项可以执行适当的操作(可能标记一个checkobx),以便构建过程(即链接器)将生成一个映射文件。 嵌入式系统的映射文件通常会以详细的方式为您提供所需的信息:内存段,它们的大小,每个内存的使用量,程序内存,数据存储器等。通常有很多地图文件提供的数据,您可能需要编写脚本来准确计算所需内容,或将其复制到Excel。 地图文件可能还包含您的摘要信息。

堆栈有点棘手。 如果地图文件给出了那个,那么就有了它。 如果没有,你需要自己找到它。 嵌入式编译器通常允许您定义堆栈的位置和大小。 在程序的开头放一个断点。 当应用程序停止时,整个堆栈归零。 恢复应用程序并让它工作一段时间。 最后停下来检查堆栈内存。 您将看到非零值而不是零。 使用的堆栈一直持续到零部分再次启动。

通常,您将在mmap生成的文件中有不同的部分,其中数据如下:
.intvect

.intvect_end
.rozdata
.robase
.rosdata
.RODATA
.text ....等等!!!

与每个部分的其他属性,如基数,大小(十六进制),大小(十进制)等。

虽然在任何时候局部变量可能占用更多或更少的空间(当它们进出范围时),它们在堆栈上被实例化。 在单线程环境中,堆栈将是链接时已知的固定分配。 所有静态分配的数据都是如此。 唯一的运行时变量部分id动态分配数据,但即使这样,sich数据也是从堆中分配的,在大多数裸机,单线程环境中,这是一个固定的链路时间分配。

因此,您可能已经由链接器提供了有关内存分配的所有信息。 通常(取决于您使用的工具链和链接器参数)在链接器运行时输出基本信息。 您通常可以请求生成完整的链接器映射文件,这将为您提供详细信息。 一些链接器可以执行堆栈使用分析,这将为您提供任何特定功能的最坏情况堆栈使用。 在单线程环境中,main()的堆栈使用情况将给出最坏情况下的总体使用情况(尽管需要考虑中断处理程序,链接器不是线程或中断感知,并且某些体系结构具有单独的中断堆栈,其中一些是共享的)。

虽然堆本身通常是固定分配(通常是链接器执行堆栈和静态数据的静态分配后的所有可用内存),但如果使用动态内存分配,则在运行时知道有多少内存可能很有用已从堆中分配,以及有关分配数量,平均分配大小以及空闲块数量及其大小的信息。 由于动态内存分配是由系统的标准库实现的,因此任何此类分析工具都将特定于您的库,并且可能根本不提供。 如果您有库源,您可以自己实现这些工具。

在多线程环境中,线程堆栈可以静态分配或从堆中分配,但无论采用哪种方式,上述相同的分析方法都适用。 对于堆栈使用情况分析,每个线程的最坏情况是从每个线程的入口点而不是从main()开始测量的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM