前些天在5510DSK上将下个项目需要用到的声音处理程序全部用C语言写好了。5510的内存有160k之多,而最终的产品为了降低成本,会使用内存更小的芯片。这样就需要统计现在的程序的内存使用量。
直接看MAP文件的MEMORY CONFIGURATION可以知道整个工程占用了多少内存,但是由于在5510DSK上实现的功能并不都是必须的,因此有必要统计每项功能所占用的内存量。这样就需要统计每个功能用到的全局变量的大小和函数的大小。
在MAP后面有以内存地址为顺序的符号列表,包括全局变量和函数。每个符号所占用的内存大致上可以通过其地址和下个符号的地址的差值获得。如果存在内存对齐(align)的话,就会出现一些偏差。每个内存区域最后一个符号的大小需要特别计算:
占用内存量=内存区域开始地址+内存区域使用量-符号地址
每个区域的开始地址和使用量在MAP文件头的MEMORY CONFIGURATION中列出。
手工进行上述统计的工作量是相当大的,因此我写了一个程序首先分析MAP文件都后半部分,计算出由符号名映射到所占用内存大小的一个哈希表。然后另外写一个程序分析C语言源文件,以获取此文件中全局符号(全局变量和函数)的列表,最后根据前面的哈希表统计每个源文件所使用的内存大小。
这两个程序用Python编写,其中分析C语言源文件较难,目前只是按照我自己的程序规范正确地找出全局符号,并不能保证其它格式也完全正确。如果要完全正确地分析源文件的话,就相当于在做编译器了。
你可以使用这个链接引用该篇文章 http://publishblog.blogchina.com/blog/tb.b?diaryID=3824938
| 内存类型 | cskyer |
| 电脑故障速排方法-内存篇 | iqyn |
| 内存不能read”问题的解决方案 | ←過呿dě.. |
| JavaMain使用 | raymondzfy |
| 内存不能被read或written解决方案 | 身在他乡 |