GNU LD可以按内存空间打印内存使用量,而不仅仅是批量百分比吗?

Fak*_*ame 6 c memory linker ld

我正在ARM mcu上创建一个嵌入式项目,它有一个带有几个不同内存空间的自定义链接器文件:

/* 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
}
Run Code Online (Sandbox Code Playgroud)

具体来说,我有许多不同的存储器设备具有不同的特性(TCM,普通RAM(在路上有D-Cache)和外部SDRAM),所有这些都被映射为同一地址空间的一部分.

我特意在不同的内存空间中放置不同的变量,具体取决于要求(我是否进入DMA,我是否有缓存一致性问题,我是否希望溢出D-cache等等).

如果我超过任何一个部分,我会收到链接器错误.但是,除非我这样做,否则链接器仅将内存使用量打印为批量百分比:

            Program Memory Usage    :   33608 bytes   1.6 % Full
            Data Memory Usage       :   2267792 bytes   91.1 % Full
Run Code Online (Sandbox Code Playgroud)

鉴于我有3个积极使用的内存空间,而且我知道我使用其中一个(SDRAM)的100%,这是一种无用的输出.

有没有办法让链接器单独输出每个内存空间的使用百分比?现在,我必须手动打开.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
Run Code Online (Sandbox Code Playgroud)

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

Fak*_*ame 8

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%
Run Code Online (Sandbox Code Playgroud)