我在做一个嵌入式项目。我试图使用GNU链接器来布局存储在外部eeprom中的一些变量。我通过将eeprom变量指定为
int __attribute__ ((section (".eeprom"))) eeprom_var1;
我还将定义eeprom的初始化变量,例如:
int __attribute__ ((section (".eeprom"))) eeprom_var2 = 0x42;
这个想法是这样的:在eeprom初始化时,初始化变量由运行中的应用程序从.text部分的某处复制到eeprom,就像初始化数据部分一样。显然,eeprom变量不能读/写,但必须通过以下函数访问:
eeprom_read(data, &eeprom_var,sizeof(eeprom_var)).
到现在为止,一直都还不错,
现在我想用另一个变量的指针初始化一个eeprom变量:
unsigned long long __attribute__ ((section (".eeprom"))) eeprom_var1 = 0x42;
unsigned short __attribute__ ((section (".eeprom"))) eeprom_var2 = (unsigned short )&eeprom_var1;
注意eeprom使用16位地址空间
但这会导致以下错误
foo.c:4:1: error: initializer element is not constant
unsigned short __attribute__ ((section (".eeprom"))) eeprom_var2 = (unsigned short )&eeprom_var1;
^
这是因为CAST to(unNealStand)是作为初始化器读取的,在C++中C.是不允许的,但是上面的表达式是可以的。
有人能想办法绕过上面的错误吗?
/安德斯
最佳答案
当将变量放入片上eeprom时,它们总是需要类型const type
。
在片上eeprom中放置指针时,它们总是需要类型type* const
(指向非常量数据的常量指针)或const type* const
(指向常量数据的常量指针)。
这似乎是你问题的真正根源。当然,一旦他们被宣布为康斯特,你就不应该抛弃康斯特。
另外,如果它是片上eeprom,是否有一个原因,你不能直接访问存储单元?在大多数系统上,您都可以做到这一点,尽管访问时间可能比对RAM变量的等效访问慢。
顺便说一句,强制转换为uint16_t
(或无符号短)只会在一个小型endian机器上为您提供16个最低有效位。代码不可移植到big-endian。可移植代码将((uint32_t)pointer >> 16)
。
关于c - 在GCC中获取指针的低16位编译时间,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27355012/