Embedded 链接器脚本::动态内存部分

Embedded 链接器脚本::动态内存部分,embedded,linker-scripts,Embedded,Linker Scripts,我想有一个动态内存映射,例如有闪存拼接在5个部分,并根据一些文件中的定义。h设置一个适当的内存映射。但要做到这一点有一些问题:) 因此,这个区域将由某些.h中的定义动态分配 MEMORY { if SOME_DEFINE == PART0 rom (rx) : ORIGIN = 0x00400000, LENGTH = 0x00040000 /* flash, 256K */ ram (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00006

我想有一个动态内存映射,例如有闪存拼接在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
}
然后,对于您正在处理的每个芯片,您可以创建一个包含该芯片细节的文件(或者让您的构建系统动态创建一个临时文件,如果它确实是动态的):

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

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

不清楚你想要什么。根据定义,链接器映射是静态的。C(或C++)源代码中的宏也是如此。它们都不是动态的。在使用链接器脚本之前,可以先通过C预处理器
cpp
运行链接器脚本。在使用
cpp
之后,您可能只需要去掉作为注释生成的任何行(任何以
#
开头的行)。之后它应该可以用作链接器脚本。类似于
cpp link.ld.pp|sed/^#/,/^/d>link.ld
但我假设您使用术语
dynamic
是从构建过程的角度出发的,并且生成的链接器脚本文件是静态的。
$ cat layout.ld
INCLUDE ./chip_layout.ld
INCLUDE ../kernel_layout.ld