我有一个复杂的数据结构(有很多不完整的数组类型/异构长度的结构数组和指向结构数组的结构的指针......)
我想把它们放在闪存中,所以我想把它们放在静态存储的 const 对象中(它们将存储在闪存上)并让编译器完成它的工作。
我正在研究嵌入式环境,其中 ROM==flash== 我无法物理更改的数据。我的内存很少,当然不足以存储我的所有数据。可以告诉 GCC 将存储静态 const 数据毫无问题地放入 ROM。
数据不能动态构建,因为它应该保留在闪存中。
我目前正在使用具有 4.8 gcc 的 C(不是 C++),并且不介意使用 GCCisms。
但是,我不断遇到错误消息,例如:
- 初始化元素不是常量
- 不兼容的指针类型
- ...
与最近的 gcc 版本不同,表明此功能(混合复合文字,指定的初始化程序,...)是最近的或不是主线的。
请注意,此代码是由程序(脚本)生成的。
除了我不断犯的错误(我可以更具体并在那里寻求帮助),你会建议什么策略:
- 继续尝试使用复合文字来使用复杂的嵌套文字结构
- 具有大量类型的复合文字
- 具有多个相互指向的复合文字类型
- 用它们的名字构建许多中间对象(使整个事情变得非常不可读)
构建一个大的 uint32_t datablob[] 并适当地转换我的结构(由于我的链接器将指定这将在哪里结束,因此无法在对象之间存储指针)
还有其他选择吗?
(编辑:添加细节)
好吧,我的问题更多的是关于通用策略,但这里有一个例子:
struct A
{
int id;
int codes[];
};
struct B
{
int b_member;
struct A *a[]; // array of ptr to A objects
};
struct C
{
int c_member;
struct B *objects[]; // array of ptrs on B
};
const struct A rom_data = { .id=4, .codes = {1,2,3,4}}; // this is in ROM
int main(void) {}
我想像我为 A 所做的那样声明一个 C 结构数组。(这意味着我不想复制数据,从磁盘读取数据或对其进行 malloc,只需声明一个包含数据的 const 即可。)
我所有关于文字的例子都非常简单。
我的平台的细节是一个 ARM 微控制器,但只要考虑我想声明一个 const。