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