如何将函数中的常量分配到想要的地址?

How to allocate constants in the function to the desired address?

我正在为嵌入式设备开发一个项目,该项目使用自定义 ld 脚本。我正在使用 GNU ARM Embedded Toolchain version 5-2016.

在链接描述文件中,我定义了一个位于特定地址的自定义部分。这是一个简化的例子:

MEMORY
{
    FLASH (RX)   : ORIGIN = 0x8000000, LENGTH = 1M
}

SECTIONS
{
  .mysection :
  {
    __mysection_start__ = .;
    *(.mysection*)
    *(.mysection)
    . = ALIGN(4);
    __mysection_end__ = .;
  } > FLASH
}

在代码中我使用__attribute__(section("mysection"))来定位自定义部分中的具体功能。考虑以下示例:

void foo1()
{
    const char str[] = "foo1_string";
}

void foo2() __attribute__((section("mysection")));
void foo2()
{
    const char str[] = "foo2_string";
}

在此示例中,我希望函数 foo2 中定义的字符串文字 str 将位于 mysection 部分,但是,它落在 .rodata 部分。

foo2 函数中的常量分配给 mysection 部分的正确方法是什么?是否可以在不向函数内的每个变量添加属性 section 的情况下执行此操作?

提前致谢。

首先,请注意您程序中的所有内容都有一个默认位置 this。除非您特别说明,否则这就是适用的。对于一个函数,这通常意味着函数本身在 .text 中结束,函数内部的局部变量在 .stack 中,函数使用的字符串文字在 .rodata 中。通过在不同的部分分配函数,这并不意味着函数内的那些项目也会以某种方式改变位置。

__attribute__((section... 类似于存储-class 说明符或类型限定符(staticconst 等),因为它属于您接下来放置它的对象或函数到。所以你必须做:

static const char str[] __attribute__((section("mysection"))) = "foo1_string";

static 因为这是函数的局部变量。没有它,它具有自动存储持续时间,然后编译器可能会试图将该变量存储在 RAM 而不是闪存中。此外,如果您将本地 RAM 变量初始化为字符串文字,则该字符串文字必须在 flash、.rodata 或类似文件中单独分配。

既然您似乎只想更改字符串文字的位置,那么您不应该将 __attribute__((section... 添加到函数中,而只能添加到单个变量中。您可能必须对存在字符串文字的程序的每个实例执行此操作。

确保检查地图文件以确保一切都在您预期的位置结束。

您可以将特定对象文件中的 .rodata 部分数据放入另一个部分

SECTIONS
{
  .mysection :
  {
    __mysection_start__ = .;
    *(.mysection*)
    *(.mysection)
    *myfile.o(.rodata)
    *myfile.o(.rodata*)
    . = ALIGN(4);
    __mysection_end__ = .;
  } > FLASH
}

在此示例中,myfile.o 中的所有数据(通常是 myfile.c 编译的结果)位于 .rodata 部分(包括字符串文字)中.mysection。您还可以在文件名中使用通配符。

我想它会解决你的问题。

__attribute__((section("mysection"))); 不正确。它必须是 __attribute__((section(".mysection"))); 因为你的部分的名称是 .mysection