不明确使用(void)寄存器值

yar*_*ron 5 c casting void

我有一些示例代码(来自Nordic),其中包括下一行:

    NRF_RADIO->EVENTS_END = 0;
    (void)NRF_RADIO->EVENTS_END;
Run Code Online (Sandbox Code Playgroud)

NRF_RADIO-> EVENTS_END是嵌入式寄存器,在第一行设置为0.

有人可以解释第二行的含义是什么?

谢谢Yaron

Yun*_*sch 5

第二行“仅”读回寄存器。这样做是通过将强制转换强制(void)为void来显式地忽略读取的实际值。

该系列有两个专长,这可能会使理解它变得不容易:

  1. 阅读时不使用值,为什么呢?
  2. 除了不使用值外,还要明确说它被忽略了,为什么呢?

1的原因很可能是涉及到外围寄存器的情况(根据OP的声明)。这可能意味着需要看似无用的阅读的机制。例如:

  • 芯片供应商仅要求虚拟读取是必要的,以实现先前写入访问的可靠,按时间顺序可预测的效果;
    有时(至少由我和我的同事)将其描述为“建议的顺序”,即不必要的直观陈述集,制造商为确保功能而禁止使用
  • 写访问具有可靠的效果,但是为了确保所需的时间顺序,与其他语句相比,有必要从寄存器中回读
    • 它通常在代表寄存器的声明中带有“ volatile”关键字
    • 这可能是一个(单独的)“推荐序列”,仅对于此受时间顺序影响的用例是必需的
    • 请注意,两个不同的特殊寄存器的两个连续语句可以具有不同的“快速”效果,因此第二个语句在第一个语句之前生效
    • 一个示例是首先访问外围设备(如端口),该外围设备通过慢速总线连接;
      随后第二次访问速度更快的连接外围设备,例如内存映射的中断控制器;
      由于不希望在重新配置端口之前重新配置中断,所以可能需要按时间顺序排列

2的原因是完全分开的,例如可以是:

  • (可能是特殊的,特定于硬件的)编译器会为所有忽略的返回值发出警告;
    许多编译器都这样做,因为忽略返回值通常是潜在的错误源,或者可能表明程序员有根本的误解
  • 在编译器之上,使用了静态分析工具,其目的类似:检测任何东西,根据经验可能会通过编码样式指示错误并提高可维护性

编辑以提高可读性和更好的结构,而无需更改基本逻辑;为了防止误解,我认为这是两位拒绝投票的人的误解。如果有合理的理由拒绝投票,请告诉我。