我希望能够在256 KB内存的有限资源环境中调试C程序使用的总内存量(目前我正在模拟器程序中进行测试)。
我能够将调试语句打印到屏幕上,但是我应该使用什么方法来计算我的C程序使用了多少(包括全局变量,局部变量[从我的主函数循环的角度来看],程序代码本身等。)?
第二个方面是显示特定变量的位置/范围,而不仅仅是它们的大小。
-Edit- CPU是Hitachi SH2,我没有让我把断点放入程序的IDE。
答案 0 :(得分:3)
使用IDE选项进行正确的操作(可能标记一个checkobx),以便构建过程(即链接器)将生成一个映射文件。 嵌入式系统的映射文件通常会以详细的方式为您提供所需的信息:内存段,它们的大小,每个内存的使用量,程序内存,数据存储器等。通常有很多地图文件提供的数据,您可能需要编写脚本来准确计算所需内容,或将其复制到Excel。地图文件可能还包含您的摘要信息。
堆栈有点棘手。如果地图文件给出了那个,那么就有了它。如果没有,你需要自己找到它。嵌入式编译器通常允许您定义堆栈的位置和大小。在程序的开头放一个断点。当应用程序停止时,整个堆栈归零。恢复应用程序并让它工作一段时间。最后停下来检查堆栈内存。您将看到非零值而不是零。使用过的堆栈会一直运行,直到零部分再次启动。
答案 1 :(得分:0)
一般情况下,mmap生成的文件中会有不同的部分,数据如下:
.intvect
.intvect_end
.rozdata
.robase
.rosdata
.RODATA
.text ....等等!!!
每个部分都有其他属性,如Base,Size(hex),Size(dec)等。
答案 2 :(得分:0)
虽然局部变量在任何时候都可能占用更多或更少的空间(当它们进出范围时),但它们在堆栈上被实例化。在单线程环境中,堆栈将是链接时已知的固定分配。所有静态分配的数据都是如此。唯一的运行时变量部分id动态分配数据,但即使这样,也会从堆中分配sich数据,在大多数裸机,单线程环境中,这是一个固定的链路时间分配。
因此,您的链接器可能已经提供了有关内存分配的所有信息。通常(取决于您使用的工具链和链接器参数)在链接器运行时输出基本信息。您通常可以请求生成完整的链接器映射文件,这将为您提供详细信息。一些链接器可以执行堆栈使用分析,这将为您提供任何特定功能的最坏情况堆栈使用。在单线程环境中,main()的堆栈使用情况将给出最坏情况下的整体使用情况(尽管需要考虑中断处理程序,链接器不是线程或中断感知,并且某些架构具有单独的中断堆栈,有些是共享的)。 p>
虽然堆本身通常是一个固定的分配(通常是链接器执行堆栈和静态数据的静态分配后的所有可用内存),但如果使用动态内存分配,则在运行时知道它可能很有用已从堆中分配了多少内存,以及有关分配数量,平均分配大小以及空闲块数量及其大小的信息。由于动态内存分配是由系统的标准库实现的,因此任何此类分析工具都将特定于您的库,并且可能根本不提供。如果你有图书馆资源,你可以自己实施这些设施。
在多线程环境中,线程堆栈可以静态分配或从堆中分配,但无论哪种方式,上述相同的分析方法都适用。对于堆栈使用情况分析,每个线程的最坏情况是从每个线程的入口点而不是从main()开始测量。