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.
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)