缓存是由缓存硬件对处理器透明地控制的,因此如果我们在C程序中使用易失性变量,如何保证我的程序每次都从指定的实际内存地址读取数据而不是缓存。
我的理解是,
Volatile 关键字告诉编译器不应优化变量引用,而应按照代码中的编程方式读取变量引用。
缓存由缓存硬件透明地控制,因此当处理器发出地址时,它不知道数据是来自缓存还是内存。
因此,如果我需要每次需要时都读取内存地址,我如何确保它不是从缓存引用而是从所需地址引用?
不知何故,这两个概念并不能很好地结合在一起。请澄清它是如何完成的。
(假设我们在缓存中有回写策略(如果需要分析问题))
谢谢你,
微内核:)
这里是固件开发者。这是嵌入式编程中的一个标准问题,也是一个困扰许多(甚至是非常有经验的)开发人员的问题。
我的假设是您正在尝试访问硬件寄存器,并且该寄存器值可能会随着时间而变化(无论是中断状态、定时器、GPIO 指示等)。
The volatile
关键字只是解决方案的一部分,并且在许多情况下可能不是必需的。这会导致变量被重新读取memory每次使用它时(而不是被编译器优化或跨多次使用存储在处理器寄存器中),但是否"memory"正在读取的是实际的硬件寄存器,而缓存的位置对于您的代码来说是未知的,并且不受volatile
关键词。如果你的函数只读取寄存器一次那么你可能可以放弃volatile
,但作为一般规则,我建议大多数硬件寄存器应定义为volatile
.
更大的问题是缓存和缓存一致性。这里最简单的方法是确保您的寄存器位于未缓存的地址空间中。这意味着每次访问寄存器时,都保证读/写实际的硬件寄存器而不是高速缓存。一种更复杂但可能性能更好的方法是使用缓存地址空间,并让您的代码针对此类特定情况手动强制缓存更新。对于这两种方法,如何实现这一点取决于架构,并且超出了问题的范围。它可能涉及 MTRR(针对 x86)、MMU、页表修改等。
希望有帮助。如果我错过了什么,请告诉我,我会扩展我的答案。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)