根据内存位置的特定值定义值

时间:2017-10-02 07:59:53

标签: c gcc stm32

我在根据内存位置的特定值定义值时遇到问题。

基本上我想读取特定内存位置的值并从该值创建一个定义。然后使用相同的define在编译代码时根据第一个定义值再次定义一个新值。

以下是我的例子:

#define MY_DEFINE_VALUE         (*(uint32_t *)0x0800C200)

// 8 kBytes of EEPROM
// First section base address is 0x08080000
// Second section base address is 0x08081000
#if ( MY_DEFINE_VALUE < 0x0200 )
#define EEPROM_BASE                             ((uint32_t)0x08080000)
#else 
#define EEPROM_BASE                             ((uint32_t)0x08081000)
#endif

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

你不能以这种方式解决这个问题,C不能那样工作。实际上它没有任何意义,因为你期望在同一个地方有两个不同的代码片段(一个使用0x08080000,另一个使用0x08081000)。

你将不得不:

  1. 构建两个不同的二进制文件,并相应地编写板。这有助于了解哪个板需要哪个二进制文件到软件之外
  2. 在运行时检查,并在代码的硬编码选项之间进行选择,或者只是使访问动态化。
  3. 我的偏好是动态运行时访问,这应该没问题,除非这是代码中性能最关键的一部分。

    所以,你要做一个变量:

    volatile uint32_t *eeprom_base;
    

    然后只需添加代码即可在运行时设置它:

    if (*(uint32_t *) 0x800c200 < 0x200)
      eeprom_base = (uint32_t *) 0x8080000;
    else
      eeprom_base = (uint32_t *) 0x8081000;
    

    然后通过变量而不是预处理器符号进行访问,或者将后者更改为:

    #define EEPROM_BASE    eeprom_base
    

    当然,你必须确保变量在所有使用它的地方都有一个可见的声明。