如何在编译时初始化闪存中的结构?

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...
};

我不确定 staticconst 关键字是否必要,因为它仅供一次性使用,用于在编译时初始化那部分闪存,但它没有限制标签的使用会受到伤害。

从句法上讲,这完全没有意义。

你需要做的是弄清楚你的编译器如何支持它,因为它不是你可以用标准 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 的扩展不是类型,因此该构造不是有效声明。它也不是有效的赋值,但即使有效,赋值语句也是可执行的,因此可能只出现在函数内部。

将对象分配给特定地址是链接器的一项功能。是否可以将对象分配给所需的特定地址取决于系统,而这样做的机制(如果有的话)取决于您的工具链。