链接描述文件 :: 动态内存部分

Linker script :: Dynamic Memory section

我想要一个动态内存映射,例如将闪存拼接成 5 个部分,并根据某些文件 .h 中的定义来设置适当的内存映射。但是做起来有一些问题:)

所以这个区域将由一些 .h 中的定义动态分配

MEMORY
{
  if SOME_DEFINE == PART0
    rom (rx)  : ORIGIN = 0x00400000, LENGTH = 0x00040000 /* flash, 256K */
    ram (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00006000 /* sram, 24K */
  else 
    rom (rx)  : ORIGIN = 0x00400000, LENGTH = 0x00040000 /* flash, 256K */
    ram (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00006000 /* sram, 24K */
  endif
}

我在使用变量之前解决了类似的需求:

定义主链接描述文件,如下所示:

$ head common_layout.ld
/* You can do something like this for optional sections */
CCFG_ORIGIN = DEFINED(CCFG_ORIGIN) ? CCFG_ORIGIN : 0;
CCFG_LENGTH = DEFINED(CCFG_LENGTH) ? CCFG_LENGTH : 0;

MEMORY
{
  rom (rx)  : ORIGIN =  ROM_ORIGIN, LENGTH =  ROM_LENGTH
  ccfg (rx) : ORIGIN = CCFG_ORIGIN, LENGTH = CCFG_LENGTH
  ram (rwx) : ORIGIN =  RAM_ORIGIN, LENGTH =  RAM_LENGTH
}

然后,对于您正在处理的每个芯片,您可以创建一个包含该芯片细节的文件(或者让您的构建系统动态创建一个临时文件,如果它确实是动态的):

$ cat chip_layout.ld
/* Memory Spaces Definitions */
ROM_ORIGIN  = 0x00010000; /* Bootloader is at 0x0000 */
ROM_LENGTH  = 0x00020000;
RAM_ORIGIN  = 0x20000000;
RAM_LENGTH = 0x00020000;

然后将您的构建工具指向将它们缝合在一起的东西,即 gcc -Tlayout.ld ...

$ cat layout.ld
INCLUDE ./chip_layout.ld
INCLUDE ../kernel_layout.ld