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

时间:2016-09-27 07:17:25

标签: embedded linker-scripts

我想要一个动态的内存映射,例如闪存拼接在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
}

1 个答案:

答案 0 :(得分:2)

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

定义主链接器脚本,如下所示:

$ 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