初始化const结构中的const数组,引用const数组

时间:2014-06-18 06:38:25

标签: c struct embedded

我在嵌入式微控制器上用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非常失望。 :\

1 个答案:

答案 0 :(得分:2)

单词const并不意味着该值存储在ROM中,这意味着该值在初始化后不应该更改。 RAM中的对象可以是const。编译可以决定是否放入ROM,这取决于优化器试图保存RAM,但没有什么可以保证它。将某些内容投射到const甚至更弱。创建时{2,3,NULL}不是const

您需要阅读编译器的手册,并弄清楚如何将对象放入ROM(或可能是闪存)。有些编译器会使用关键字来执行此操作,例如code__rom,而不是const

另一种方法是创建一个新的"部分"在链接器文件中,将所有ROM变量放在该部分中。

不幸的是,没有标准的方法。