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

时间:2018-05-09 13:54:16

标签: c eclipse initialization embedded flash-memory

我正在开发一个嵌入式C项目,并希望在编译时初始化一个存储在flash(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...
};

我得到的错误是&#34; 预期&#39; {&#39;之前&#39;(&#39;令牌。&#34;任何人都知道如何使这项工作?

更新

已添加到链接器文件...

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关键字是否必要,因为它仅用于一次性使用,以便在编译时初始化该部分闪存,但限制标签的使用并没有什么坏处。

3 个答案:

答案 0 :(得分:0)

完全没有意义,从语法上来说就是这样。

你需要做的是弄清楚你的编译器如何支持它,因为它不是你可以用标准C做的事情。

使用GCC,您可以使用__attribute()将符号放在特定的段中,然后使用链接描述文件将该段放在特定的实际内存中。

或者,只是让您的编译器怀疑并尝试static const结构, 应该在flash中结束。

答案 1 :(得分:0)

在你给出的例子中,一个“;”在声明MY_STRUCT_DATA_TYPE

后丢失
typedef struct {
    float foo[2];
    ...other stuff...
} MY_STRUCT_DATA_TYPE;

如果它不是复制/粘贴错误,那就是可能导致您输入错误消息类型的错误

答案 2 :(得分:0)

  

我正在开发一个嵌入式C项目,并希望初始化,at   编译时,一个存储在flash(0x1200u)中的结构,但是我   不断变得奇怪的编译错误。

这并不令人惊讶,因为C不支持您尝试做的事情。您可以为C分配的对象(包括指针)提供初始值设定项,但C语言没有独立存在的对象的概念。实际上,C不保证当您使用(MY_STRUCT_DATA_TYPE *)(0x1200u)执行任何操作时会发生什么,而不是将其转换回整数。

  

我得到的错误是&#34; 预期&#39; {&#39;之前&#39;(&#39;令牌。&#34;

编译器抱怨,因为

MY_FLASH_STRUCT MY_InitdStruct = {

MY_FLASH_STRUCT的扩展不是类型,因此构造不是有效的声明。它也不是有效的赋值,但即使它是,赋值语句也是可执行的,因此可能只出现在函数内部。

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

相关问题