【问题标题】:Is there any reason to declare something "volatile const" in C but only "volatile" in C++?是否有任何理由在 C 中声明“volatile const”但在 C++ 中仅声明“volatile”?
【发布时间】:2014-10-19 21:01:02
【问题描述】:

我在我的项目中使用了一个具有以下定义的头文件:

#ifdef __cplusplus
  extern "C" {
#endif 

#ifdef __cplusplus
  #define   __I     volatile             /*!< Defines 'read only' permissions*/
#else
  #define   __I     volatile const       /*!< Defines 'read only' permissions*/
#endif

__I在另一个头文件中使用如下:

    typedef struct {   
    // more members before         
      __I  uint32_t  CR;   /*!< GPIO Commit*/
    // more members after

    } GPIOA_Type;

#define GPIOF_BASE                      0x40025000UL
#define GPIOF                           ((GPIOA_Type *) GPIOF_BASE)

我的问题是为什么 __I 在 C 中是 const 而不是在 C++ 中?由于您有地址,您仍然可以修改 CR 指向的值,但我只是好奇为什么 __I 的定义不同。

对于任何对此感兴趣或来自何处的人, __I 定义来自 IAR Embedded Workbench ARM for Cortex-M4 , 结构来自德州仪器 LM4F120H5QR CMSIS 文件。

【问题讨论】:

  • 在 C++ 中 const 提供内部链接。我不知道它是否在 C 中,但我怀疑不是。无论如何,请注意__I 是为实现保留的名称,不应在用户代码中使用。
  • @Mat McNabb 我的意思是,因为我有 CR 寄存器的确切地址,我可以执行以下 #define GPIO_PORTF_CR_R (*((volatile unsigned long *)0x40025524)) ,然后执行 GPIO_PORTF_CR_R = xxxxx ,然后这会改变寄存器的值。
  • @SoftwareDev OK - volatile const CR 表示您不能使用CR 修改寄存器;当然也可以用其他方式修改
  • @MattMcNabb 是的,这就是我认为您的意思,只是想添加它以供其他人澄清。谢谢。

标签: c++ c iar cortex-m cmsis


【解决方案1】:

在 C++ 中,文件范围内的 const 变量默认为静态链接,这对于内存映射的 GPIO 来说是不需要的。对此的“正确”修复是 extern 关键字,但不能在此处使用,因为显然 __I 也需要与类成员一起使用。因此,消除const 会根据需要生成默认链接extern

【讨论】:

  • 如果是这个原因,我还要注意,编写原始代码的人可能应该“分叉”__I,以便为成员变量提供与全局变量不同的版本
  • @MattMcNabb:事后诸葛亮总是 20-20。 C++ 支持可能是在宏用于全局和成员的 C 代码中很久之后才添加的。
  • @BenVoigt 有道理。所以基本上,写这段代码的人说“没有办法让 CR 在 C++ 中只读,即使那是我们想要的”?虽然我更倾向于编写 C 代码的人没有正确读取数据表,因为根据它,CR 寄存器的值可以从默认值更改,实际上如果不能更改,则无法启用上拉正在使用的开发板中的一个开关中的电阻。
  • @SoftwareDev:我没有查看特定芯片甚至 LM4F 系列的特定寄存器。但我猜这些宏用于所有特殊功能寄存器,而不仅仅是 GPIO CR?将 CR 在标头中标记为仅输入可能是一个错误,但肯定有相当多的寄存器确实应该是仅输入的。
  • @SoftwareDev:事实上,头文件可能故意比硬件更严格。如果你要禁用编程引脚的编程功能,你只写GPIOCR......如果你有一个错误,这是一个单程旅行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-20
  • 2013-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多