![]() |
1
19
在需要访问设备寄存器的嵌入式编程中,这是一个相当常见的习惯用法(尽管它应该封装在一组函数或宏中)。在许多体系结构中,设备寄存器被映射到一个内存地址,并像任何其他变量一样被访问(尽管在一个固定的地址上——可以使用指针,也可以使用链接器或编译器扩展来帮助修复地址)。但是,如果C编译器没有看到变量访问的副作用,它可以将其优化掉——除非变量(或用于访问变量的指针)被标记为volatile。 所以表达;
将在某个偏移量(由
注意,一些设备寄存器执行一些功能,即使它们只是简单地被读取——即使数据读取没有被使用。这在状态寄存器中是很常见的,在读取指示特定位中错误状态的寄存器后,可能会清除错误条件。
这可能是使用
|
![]() |
2
9
所以这是一个远射。 如果该地址指向FPGA或其他设备上的内存映射区域,那么当您读取该地址时,该设备实际上可能正在执行某些操作。 |
![]() |
3
9
我认为作者的意图是使编译器发出 记忆障碍 在这一点上。通过评估 不稳定的 ,编译器的指示是,不应将此表达式优化掉,并且应“实例化”在出现此习惯用法的每一行对易失位置(内存屏障、优化限制)的访问语义。
这种类型的习惯用法可以“封装”在预处理器宏中。(
编辑:用户sharth有一个很好的观点,如果此代码在指针地址为 身体的 而不是 事实上的 地址(或映射到特定物理地址的虚拟地址),然后执行此读取操作可能会导致外围设备发生某些操作。 |
![]() |
4
-1
通常这是错误的代码。 在C和C++中挥发物的手段非常少,不提供内隐记忆障碍。所以这段代码是完全错误的,如果它写为
这只是错误的代码。
费用:
Reed本文: http://www.mjmwired.net/kernel/Documentation/volatile-considered-harmful.txt
这就是为什么
|
![]() |
rookie · 检查函数模板的所有参数包参数是否属于int 1 年前 |
![]() |
ivaigult · -W转换和隐式字符串到布尔类型转换 1 年前 |
![]() |
rainer · 后台插入程序的初始化 1 年前 |
![]() |
Community wiki · 以理智、安全和高效的方式复制文件 1 年前 |
|
Shefali Kanaujia · 对C中向量的向量进行排序++ 1 年前 |
|
Ma Joonyoung · 粗粒度和细粒度链表的时间比较 1 年前 |