以下链接表示"访问设备寄存器始终未缓存"
我的问题是,在访问存储器映射的设备寄存器时,我们是否需要易失性?
答案 0 :(得分:5)
这里的困惑来自两个机制,它们的目标有相似之处,但机制和实施水平截然不同。
该链接指的是内存映射的I / O区域被配置为不适用于快速中间内存中的硬件缓存,用于加速操作与访问较慢的主内存库相比。传统上,这对软件来说几乎是透明的(例外情况就是修改具有不同指令和数据缓存的机器上的代码)。
相比之下,volatile
用于禁止优化编译器执行"软件"通过策略性地将它们保存在寄存器中来缓存值,延迟计算它们直到需要,或者如果不需要则可能永远不计算它们。基本的作用是通知编译器该值可能由其分析不可见的机制产生或消耗 - 可以是当前处理器核心之外的硬件,也可以是不同的线程或执行上下文。
答案 1 :(得分:2)
此问题是Why is volatile needed in C?
的特定于处理程序的版本这是强制要求volatile
的两种情况之一(如果编译器能够知道这种情况会很好。)
任何内存位置都可以在没有代码启动的情况下更改(即内存映射设备寄存器)或没有线程启动它(即由另一个线程或中断处理程序更改) 绝对必须声明为volatile
,以防止编译器优化内存获取操作。