我正在开发一个嵌入式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...
};
我不确定static
或const
关键字是否必要,因为它仅用于一次性使用,以便在编译时初始化该部分闪存,但限制标签的使用并没有什么坏处。
答案 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
的扩展不是类型,因此构造不是有效的声明。它也不是有效的赋值,但即使它是,赋值语句也是可执行的,因此可能只出现在函数内部。
将对象分配给特定地址将是链接器的功能。是否可以将对象分配给所需的特定地址取决于系统,如果有的话,机制(如果有)取决于您的工具链。