2016-12-30 19 views
4

我工作的一个嵌入式项目上有几种不同的存储空间自定义链接文件中的ARM MCU:GNU LD可以通过内存空间打印内存使用情况,而不仅仅是散装百分比?

/* Memory Spaces Definitions */ 
MEMORY 
{ 
    rom  (rx) : ORIGIN = 0x00400000, LENGTH = 0x00200000 
    data_tcm (rw) : ORIGIN = 0x20000000, LENGTH = 0x00008000 
    prog_tcm (rwx) : ORIGIN = 0x00000000, LENGTH = 0x00008000 
    ram  (rwx) : ORIGIN = 0x20400000, LENGTH = 0x00050000 
    sdram (rw) : ORIGIN = 0x70000000, LENGTH = 0x00200000 
} 

具体来说,我公司拥有一批具有不同特征的不同的存储设备(TCM的,纯RAM(带有一个D-Cache)和一个外部SDRAM),它们都被映射为同一地址空间的一部分。

根据需要,我特别在不同的内存空间中放置了不同的变量(我是否正在进入DMA中,是否存在缓存一致性问题,我是否期望溢出D缓存等。 ..)。

如果我超过了任何一个部分,我会收到链接器错误。但是,如果我这样做,链接器将只打印内存使用散装率:

  Program Memory Usage : 33608 bytes 1.6 % Full 
      Data Memory Usage  : 2267792 bytes 91.1 % Full 

假设我有3个积极使用的内存空间,我知道一个事实,即我使用一个100% (SDRAM),这是一种无用的输出。

有什么办法让链接器输出每个内存空间单独使用的百分比?现在,我必须手动打开.map文件,搜索节标题,然后手动从.ld文件中指定的总可用内存中减去大小。

虽然这是一种轻微的事情,它会肯定是不错的只是链接器做:

Program Memory Usage : 33608 bytes 1.6 % Full 
Data Memory Usage  : 2267792 bytes 91.1 % Full 
    data_dtcm   : xxx bytes xx % Full 
    ram     : xxx bytes xx % Full 
    sdram    : xxx bytes xx % Full 

这是GCC-ARM,因此GCC-LD。

回答

3

Arrrgh,所以当然,我问这个问题后马上找到了答案:

--print-memory-usage

用作-Wl,--print-memory-usage,你会得到如下:

Memory region   Used Size Region Size %age Used 
       rom:  31284 B   2 MB  1.49% 
      data_tcm:  26224 B  32 KB  80.03% 
      prog_tcm:   0 GB  32 KB  0.00% 
       ram:  146744 B  320 KB  44.78% 
       sdram:   2 MB   2 MB 100.00%