c - 在 GCC 中获取指针编译时间的低 16 位

标签 c gcc linker embedded eeprom

我正在从事一个嵌入式项目。我正在尝试使用 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/

相关文章:

c++ - main 之外的段错误

c - 迭代修改 C 中的函数

c - 一个计算字符串中有多少个不同字符的函数

我可以强制 cmake 在特定目标中包含我的头文件吗?

gcc - 在 Linux 中混合使用 32 位和 64 位库 (gcc)

c++ - 静态常量类成员声明

c++ - 使用 qt 模板时未解析的外部?

ios - 使用 Objective-C/C 查找 DST(夏令时)时间戳?

c++ - 如何更改静态名称参数中的文件甚至数组的名称?

c - 传递变量而不是常量时对 `sin' 的 undefined reference