【发布时间】:2014-09-03 20:16:14
【问题描述】:
我有一个复杂的数据结构(有很多不完整的数组类型/结构的异构长度数组和指向结构数组的结构的指针......)
我想把它们放在闪存中,所以我想把它们放在静态存储的 const 对象中(它们将存储在闪存上)并让编译器完成它的工作。
我正在研究嵌入式环境,其中 ROM==flash== 我无法物理更改的数据。我的内存很少,当然不足以存储我的所有数据。可以告诉 GCC 将存储静态 const 数据毫无问题地放入 ROM。
数据不能动态构造,因为它应该保留在闪存中。
我目前使用的是 C(不是 C++),gcc 为 4.8,不介意使用 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。
【问题讨论】:
-
没有看到一些示例代码,很难评论你看到的具体错误......
-
我建议整理一个简化的示例来演示您遇到的问题。就目前而言,这个问题太宽泛了。
-
当然,我的问题更多是关于使用的策略而不是具体错误,但我可以提供细节。
-
初始化元素不是常量,至少是由于 char array[int* fromsomewhereelse] = "";
-
自下而上存储结构并将指针转换为文件偏移量可能是一个合适的解决方案。
标签: c embedded c99 literals compound-literals