如何在编译时初始化闪存中的结构?
How to initialize structure in flash at compile time?
我正在开发一个嵌入式 C 项目,想在编译时初始化一个存储在闪存 (0x1200u) 中的结构,但我不断收到奇怪的编译错误。
typedef struct {
float foo[2];
...other stuff...
} MY_STRUCT_DATA_TYPE
#define MY_FLASH_STRUCT ((MY_STRUCT_DATA_TYPE *)(0x1200u)) // <-- error here
MY_FLASH_STRUCT MY_InitdStruct = {
.foo[0] = 0.12345f;
.foo[1] = 0.54321f;
...other stuff...
};
我得到的错误是“在'('令牌之前预期'{'。”任何人都知道如何使这个工作?
更新
已添加到链接器文件...
MEMORY
{
... other stuff ...
m_my_data_section (RW) : ORIGIN = 0x00001200, LENGTH = 0x00000400
... other stuff ...
}
SECTIONS
{
... other stuff ..
.my_data_section :
{
. = ALIGN(4);
KEEP(*(.my_data_section))
. = ALIGN(4);
} > m_my_data_section
... other stuff ...
}
C代码...
static volatile const MY_STRUCT_DATA_TYPE __attribute__ ((section (".my_data_section"))) MY_InitdStruct = {
.foo[0] = 0.12345f;
.foo[1] = 0.54321f;
...other stuff...
};
我不确定 static
或 const
关键字是否必要,因为它仅供一次性使用,用于在编译时初始化那部分闪存,但它没有限制标签的使用会受到伤害。
从句法上讲,这完全没有意义。
你需要做的是弄清楚你的编译器如何支持它,因为它不是你可以用标准 C 做的事情。
使用 GCC,您可以使用 __attribute()
将符号放入特定段,然后使用链接描述文件将该段放入实际内存的特定部分。
或者,只是让您的编译器从怀疑中获益并尝试使用 static const
结构, 应该 最终出现在 flash 中。
在你给出的例子中,一个“;”在 MY_STRUCT_DATA_TYPE
声明后丢失
typedef struct {
float foo[2];
...other stuff...
} MY_STRUCT_DATA_TYPE;
如果这不是 copie/paste 错误,那么这种错误可能会导致出现您遇到的错误消息类型
I'm working on an embedded C project and would like to initialize, at
compile-time, a structure that is stored in flash (0x1200u), but I
keep getting weird compile errors.
这不足为奇,因为 C 不支持您正在尝试做的事情。你可以为 C 分配的对象提供初始化器,包括指针,但 C 语言没有独立存在的对象的概念。事实上,除了将 (MY_STRUCT_DATA_TYPE *)(0x1200u)
转换回整数
之外,C 不保证你对 (MY_STRUCT_DATA_TYPE *)(0x1200u)
做任何事情时会发生什么。
The error I'm getting is "expected '{' before '(' token."
编译器报错是因为在
MY_FLASH_STRUCT MY_InitdStruct = {
,MY_FLASH_STRUCT
的扩展不是类型,因此该构造不是有效声明。它也不是有效的赋值,但即使有效,赋值语句也是可执行的,因此可能只出现在函数内部。
将对象分配给特定地址是链接器的一项功能。是否可以将对象分配给所需的特定地址取决于系统,而这样做的机制(如果有的话)取决于您的工具链。
我正在开发一个嵌入式 C 项目,想在编译时初始化一个存储在闪存 (0x1200u) 中的结构,但我不断收到奇怪的编译错误。
typedef struct {
float foo[2];
...other stuff...
} MY_STRUCT_DATA_TYPE
#define MY_FLASH_STRUCT ((MY_STRUCT_DATA_TYPE *)(0x1200u)) // <-- error here
MY_FLASH_STRUCT MY_InitdStruct = {
.foo[0] = 0.12345f;
.foo[1] = 0.54321f;
...other stuff...
};
我得到的错误是“在'('令牌之前预期'{'。”任何人都知道如何使这个工作?
更新
已添加到链接器文件...
MEMORY
{
... other stuff ...
m_my_data_section (RW) : ORIGIN = 0x00001200, LENGTH = 0x00000400
... other stuff ...
}
SECTIONS
{
... other stuff ..
.my_data_section :
{
. = ALIGN(4);
KEEP(*(.my_data_section))
. = ALIGN(4);
} > m_my_data_section
... other stuff ...
}
C代码...
static volatile const MY_STRUCT_DATA_TYPE __attribute__ ((section (".my_data_section"))) MY_InitdStruct = {
.foo[0] = 0.12345f;
.foo[1] = 0.54321f;
...other stuff...
};
我不确定 static
或 const
关键字是否必要,因为它仅供一次性使用,用于在编译时初始化那部分闪存,但它没有限制标签的使用会受到伤害。
从句法上讲,这完全没有意义。
你需要做的是弄清楚你的编译器如何支持它,因为它不是你可以用标准 C 做的事情。
使用 GCC,您可以使用 __attribute()
将符号放入特定段,然后使用链接描述文件将该段放入实际内存的特定部分。
或者,只是让您的编译器从怀疑中获益并尝试使用 static const
结构, 应该 最终出现在 flash 中。
在你给出的例子中,一个“;”在 MY_STRUCT_DATA_TYPE
声明后丢失typedef struct {
float foo[2];
...other stuff...
} MY_STRUCT_DATA_TYPE;
如果这不是 copie/paste 错误,那么这种错误可能会导致出现您遇到的错误消息类型
I'm working on an embedded C project and would like to initialize, at compile-time, a structure that is stored in flash (0x1200u), but I keep getting weird compile errors.
这不足为奇,因为 C 不支持您正在尝试做的事情。你可以为 C 分配的对象提供初始化器,包括指针,但 C 语言没有独立存在的对象的概念。事实上,除了将 (MY_STRUCT_DATA_TYPE *)(0x1200u)
转换回整数
(MY_STRUCT_DATA_TYPE *)(0x1200u)
做任何事情时会发生什么。
The error I'm getting is "expected '{' before '(' token."
编译器报错是因为在
MY_FLASH_STRUCT MY_InitdStruct = {
,MY_FLASH_STRUCT
的扩展不是类型,因此该构造不是有效声明。它也不是有效的赋值,但即使有效,赋值语句也是可执行的,因此可能只出现在函数内部。
将对象分配给特定地址是链接器的一项功能。是否可以将对象分配给所需的特定地址取决于系统,而这样做的机制(如果有的话)取决于您的工具链。