C 如何在编译时在flash中初始化结构?
我正在处理一个嵌入式C项目,希望在编译时初始化一个存储在flash(0x1200u)中的结构,但我不断遇到奇怪的编译错误C 如何在编译时在flash中初始化结构?,c,eclipse,initialization,embedded,flash-memory,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_InitdS
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...
};
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,您可以使用\u attribute()
将符号放入特定的段中,然后使用链接器脚本将该段放入特定的实际内存中
或者,让您的编译器不必怀疑,然后尝试一个
静态常量
结构,它应该以flash结束。在您给出的示例中,在声明MY_STRUCT\u DATA\u TYPE之后缺少“;”
typedef struct {
float foo[2];
...other stuff...
} MY_STRUCT_DATA_TYPE;
如果这不是复制/粘贴错误,则是可能导致您收到的错误消息类型的错误
我正在从事一个嵌入式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...
};
这并不奇怪,因为C不支持您尝试执行的操作。您可以为C分配的对象(包括指针)提供初始值设定项,但C语言没有独立存在的对象的概念。事实上,除了将其转换回整数之外,C对使用(MY_STRUCT\u DATA_TYPE*)(0x1200u)
执行任何操作时发生的情况都不作任何保证
我得到的错误是“应该是“{”之前的“('token.”
编译器正在抱怨,因为
MY_FLASH_STRUCT MY_InitdStruct = {
,MY_FLASH_STRUCT的扩展不是类型,因此构造不是有效的声明。它也不是有效的赋值,但即使是,赋值语句也是可执行的,因此只能出现在函数内部
将对象分配到特定地址将是链接器的一项功能。是否可以将对象分配到所需的特定地址取决于系统,并且这样做的机制(如果有的话)取决于您的工具链。关键是它需要位于内存中的特定位置。我已经在e链接器文件。
\u属性()的用法
可能是我缺少的。我接受了你的答案,因为你让我走上了正确的轨道。谢谢!使用链接器脚本放置结构,使用语言初始化it@Jim您使用的是什么操作系统?@abcOfJavaAndCPP没有操作系统。这是一个裸机C项目。程序将想要的起始值分配给这个项目会不会太糟糕程序输入后立即执行struct?为什么要使用volatile
?