gpt4 book ai didi

c - (void) 与寄存器值的不明确使用

转载 作者:太空狗 更新时间:2023-10-29 15:03:28 25 4
gpt4 key购买 nike

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

    NRF_RADIO->EVENTS_END = 0;
(void)NRF_RADIO->EVENTS_END;

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

谁能解释一下第二行是什么意思?

谢谢亚龙

最佳答案

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

这条线有两个特点,这可能使理解它变得非常重要:

  1. 不使用值就读取,为什么?
  2. 除了不使用该值外,还要明确说明它会被忽略,为什么?

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

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

2 的原因是完全独立的,例如可以是:

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

为了可读性和更好的结构而编辑,但不改 rebase 本逻辑;为了有希望地防止误解,我认为这两个反对者都有。如果有合理的理由拒绝投票,请告诉我。

关于c - (void) 与寄存器值的不明确使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43829847/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com