GCC 链接器脚本 - 将 .bss 部分拆分为多个 RAM 区域

问题描述

嵌入式设备有两个 SRAM 区域。首先在 0x20000000 和长度 16k。然后在 0x20040000 长度为 96k。在应用程序中,生成的 .bss 部分大小为 102k,因此它不完全适合任一 RAM 区域。它需要在两个区域之间拆分。如何在 .ld 链接器脚本中执行此操作?

我知道两个很笨拙的选项。

选项 A:在脚本中按名称手动选择对象并将它们拆分为两个部分。使用此选项,我觉得我正在手动执行链接器应该执行的操作。

选项 B:将属性放置到源代码中,使某些对象位于特殊的 .bss2 部分。这个比选项A更糟糕。

我希望链接自动在两个内存区域之间以最佳方式拆分对象。我知道至少 IAR 链接器可以在没有任何手动工作的情况下以最佳方式执行此操作。

解决方法

我从一位恩智浦员工那里得知:
“GNU 链接器以线性方式浏览链接器脚本文件,不会尝试填充内容或将变量分配到不同的内存区域。”
您必须创建一个 bss2 部分并在启动文件中对其进行初始化,然后选择选项 A 或 B。您也可以使用其他工具链,它们中的大多数都能够将变量分配到不同的内存部分>

链接脚本:

.bss2 :
  {
    . = ALIGN(4);
    __bss2_start__ = .;
    *(.bss2)
    *(.bss2.*)
    . = ALIGN(4);
    __bss2_end__ = .;
  } > RAM2 AT > RAM2