我在嵌入式微控制器上用C工作,并试图用一个const结构数组声明和初始化(在ROM中)一个const结构,如这个极其简化的例子所示:
typedef struct s_test TestStruct;
struct s_test {
char c;
int const * const ptr;
};
TestStruct const test1 = { 'a', NULL };
TestStruct const test2 = { 'a', (const int const []){ 2, 3, NULL } };
实例test1按预期占用ROM,而在实例test2的情况下,子数组最终在RAM中(不是ROM,如预期的那样)。
如果我声明一个中间数组,那么使用对该数组的引用,结构和数组实例按预期占用ROM ...
int const array1[] = { 1, 2, NULL };
TestStruct const test3 = { '1', array1 };
为什么,当我在结构初始化中声明并初始化数组时,子数组是否存储在RAM中而不是ROM中?也许我的语法不正确?有成功的方法吗?这将使 这么多 更可读的数据结构声明和初始化,而不必向前声明所有中间子数组。最初我以为我是如此聪明地宣布我的数据结构,但后来发现它主要占用RAM非常失望。 :\
答案 0 :(得分:2)
单词const
并不意味着该值存储在ROM中,这意味着该值在初始化后不应该更改。 RAM中的对象可以是const
。编译可以决定是否放入ROM,这取决于优化器试图保存RAM,但没有什么可以保证它。将某些内容投射到const
甚至更弱。创建时{2,3,NULL}
不是const
。
您需要阅读编译器的手册,并弄清楚如何将对象放入ROM(或可能是闪存)。有些编译器会使用关键字来执行此操作,例如code
或__rom
,而不是const
。
另一种方法是创建一个新的"部分"在链接器文件中,将所有ROM变量放在该部分中。
不幸的是,没有标准的方法。