c++ - 有点奇怪的C++代码

标签 c++ c embedded

抱歉,如果这很简单,我的 C++ 生锈了。

这是在做什么?据我所知,没有赋值或函数调用。这个代码模式在我继承的一些代码中重复了很多次。如果它很重要,那就是嵌入式代码。

*(volatile UINT16 *)&someVar->something;

编辑:从那里继续,以下附加代码是否证实了希思的怀疑? (完全来自代码,包括重复,除了名称已更改以保护无辜者)

if (!WaitForNotBusy(50)) 
    return ERROR_CODE_X;

*(volatile UINT16 *)& someVar->something;

if (!WaitForNotBusy(50)) 
    return ERROR_CODE_X;

*(volatile UINT16 *)& someVar->something;
x = SomeData;

最佳答案

这是在需要访问设备寄存器的嵌入式编程中相当常见的习惯用法(尽管它应该封装在一组函数或宏中)。在许多体系结构中,设备寄存器被映射到内存地址并像任何其他变量一样访问(尽管在固定地址 - 可以使用指针或者链接器或编译器扩展可以帮助固定地址)。但是,如果 C 编译器没有看到对变量访问的副作用,它可以优化它 - 除非变量(或用于访问变量的指针)被标记为 volatile 。

所以表达式;

*(volatile UINT16 *)&someVar->something;

将从存储在 someVar 指针中的地址的某个偏移量(由 something 结构元素的偏移量提供)发出 16 位读取。由于 volatile 关键字,此读取将发生并且无法被编译器优化掉。

请注意,一些设备寄存器执行一些功能,即使它们只是被读取——即使读取的数据没有被使用。这在状态寄存器中很常见,在读取指示特定位中的错误状态的寄存器后,可能会清除错误条件。

这可能是使用 volatile 关键字的更常见原因之一。

关于c++ - 有点奇怪的C++代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1792520/

相关文章:

c++ - GCC -E -MD 有错误还是我遗漏了什么?

c - 通用求和宏和嵌套宏扩展

c++ - 在 C++ 中使用 C 头文件中的外部变量

c - 无法在 UDP 中发送完整句子

embedded - 当全局中断被禁用时,中断是否保持其状态?

c - 如何检测/防止计数器溢出

c++ - 似乎头文件被忽略/继承不工作

c++ - 旋转后字典序最小的字符串

c++ - 如何在函数模板中获得不同类型

c - Raspberry Pi RS232 读取 RFID 应答器