我正在从事一个嵌入式项目。我正在尝试使用 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使用16bit地址空间
但是这给出了以下错误
foo.c:4:1: error: initializer element is not constant
unsigned short __attribute__ ((section (".eeprom"))) eeprom_var2 = (unsigned short )&eeprom_var1;
^
这是因为转换为 (unsigned short) 被读取为作为初始化程序的操作,这在 C 中是不允许的。但是在 C++ 中,上面的表达式是可以的。
谁能想出解决上述错误的办法吗?
/安德斯
最佳答案
- 在片上 eeprom 中放置变量时,它们始终需要是
const type
类型。 - 在片上 eeprom 中放置指针时,它们始终需要是类型
type* const
(指向非常量数据的常量指针)或const type* const
(指向常量数据的常量指针)。
这似乎是您问题的真正根源。当然,一旦它们被声明为 const,您就不应该放弃 const 特性。
另外,如果是on-chip eeprom,有没有不能直接访问内存单元的原因?在大多数系统上,您都可以这样做,尽管访问时间可能比对 RAM 变量的等效访问要慢。
作为旁注,转换为 uint16_t
(或 unsigned short)只会在小端机器上为您提供 16 个最低有效位。该代码不可移植到大端。可移植代码将是 ((uint32_t)pointer >> 16)
。
关于c - 在 GCC 中获取指针编译时间的低 16 位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27355012/