如何将函数中的常量分配到想要的地址?
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 说明符或类型限定符(static
、const
等),因为它属于您接下来放置它的对象或函数到。所以你必须做:
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
我正在为嵌入式设备开发一个项目,该项目使用自定义 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 说明符或类型限定符(static
、const
等),因为它属于您接下来放置它的对象或函数到。所以你必须做:
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