C 易失性变量和高速缓存

2024-04-11

缓存是由缓存硬件对处理器透明地控制的,因此如果我们在C程序中使用易失性变量,如何保证我的程序每次都从指定的实际内存地址读取数据而不是缓存。

我的理解是,

  1. Volatile 关键字告诉编译器不应优化变量引用,而应按照代码中的编程方式读取变量引用。

  2. 缓存由缓存硬件透明地控制,因此当处理器发出地址时,它不知道数据是来自缓存还是内存。

因此,如果我需要每次需要时都读取内存地址,我如何确保它不是从缓存引用而是从所需地址引用?

不知何故,这两个概念并不能很好地结合在一起。请澄清它是如何完成的。

(假设我们在缓存中有回写策略(如果需要分析问题))

谢谢你, 微内核:)


这里是固件开发者。这是嵌入式编程中的一个标准问题,也是一个困扰许多(甚至是非常有经验的)开发人员的问题。

我的假设是您正在尝试访问硬件寄存器,并且该寄存器值可能会随着时间而变化(无论是中断状态、定时器、GPIO 指示等)。

The volatile关键字只是解决方案的一部分,并且在许多情况下可能不是必需的。这会导致变量被重新读取memory每次使用它时(而不是被编译器优化或跨多次使用存储在处理器寄存器中),但是否"memory"正在读取的是实际的硬件寄存器,而缓存的位置对于您的代码来说是未知的,并且不受volatile关键词。如果你的函数只读取寄存器一次那么你可能可以放弃volatile,但作为一般规则,我建议大多数硬件寄存器应定义为volatile.

更大的问题是缓存和缓存一致性。这里最简单的方法是确保您的寄存器位于未缓存的地址空间中。这意味着每次访问寄存器时,都保证读/写实际的硬件寄存器而不是高速缓存。一种更复杂但可能性能更好的方法是使用缓存地址空间,并让您的代码针对此类特定情况手动强制缓存更新。对于这两种方法,如何实现这一点取决于架构,并且超出了问题的范围。它可能涉及 MTRR(针对 x86)、MMU、页表修改等。

希望有帮助。如果我错过了什么,请告诉我,我会扩展我的答案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C 易失性变量和高速缓存 的相关文章

随机推荐

  • Java - 二维数组检查对角线数字板

    目前我正在开发一个在 8x8 2D 阵列板中生成随机 0 和 1 的程序 我要做的是检查对角线上的所有数字是否相同 从角开始 而不仅仅是任何对角线 example int array 0 0 0 0 0 0 0 1 0 0 1 0 1 0
  • VS Code 无法正确设置断点

    我正在尝试调试一个小项目 但无法让 Chrome 扩展调试器完全工作 当我放置断点时 它会移到我想要调试的函数之外 我正在使用 webpack babel 我的项目托管在 Net 平台 特别是 DNN 上 包 json name disab
  • InputDispatcher:由于输入调度被禁用而丢弃事件

    我正在为 Android 开发 ui 自动化平台 由于某种原因 有时 非常罕见 点击事件可能会被删除 当它发生时我在日志中看到 I InputDispatcher 2707 Dropped event because input dispa
  • VS2010,F5 - 构建但不运行(WPF)

    我们刚刚将 WPF 应用程序转换为 VS2010 当我按 F5 时 解决方案会构建 但随后不会运行 如果我执行 CNTL F5 无需调试即可启动 应用程序运行得很好 有任何想法吗 谢谢 杰夫 不知道那是什么 删除 suo文件 关闭VS201
  • 根据显示器分辨率缩放网站?

    我正在寻找一个 JavaScript 来根据浏览者的屏幕分辨率更改网站的缩放 我在桌面上制作了 1920x1080p 的网站 html moz transform scale 0 75 0 75 zoom 0 75 zoom 75 我在我的
  • 无法通过 JNDI 查找 OSGI 服务

    我正在使用 JBossAS7 我的应用程序有一些 OSGI 模块和大型非 OSGI 部分 我尝试通过 JNDI 在非 osgi 子系统中查找 osgi 服务 但它们不存在于 JNDI 上下文中 我发现类似的问题JBOSS 7 JNDI 树中
  • 在程序集中搜索所有子类型?

    我想找到从基 接口继承的所有类型 有人有一个好的方法来做到这一点吗 有想法吗 我知道这是一个奇怪的请求 但我仍然在玩它 使用 Assembly GetTypes 获取所有类型 并使用 Type IsAssignableFrom 检查继承 如
  • 通过 Android Intent 共享位图

    在我的 Android 应用程序中 我有一个位图 比如 b 和一个按钮 现在 当我单击按钮时 我想共享位图 我正在使用下面的代码onClick 为了达成这个 Intent intent new Intent Intent ACTION SE
  • Bash 脚本 - 自动填写答案

    我有一个 bash 脚本 其中有几个问题 是否可以自动填写答案 script sh install 按顺序回答y 2 1 n n 我怎样才能在 bash 中做到这一点 编辑 是否可以只通过第一个答案 echo y install 并让用户选
  • C++ - 重复使用 istringstream

    我有一个代码用于读取在线存储的浮点数文件 如下所示 3 34 2 3409 1 0001 1 1 我想使用 istringstream 阅读它们 但它并不像我预期的那样工作 string row string strNum istrings
  • ios8 中 iphone 的 UIPopoverController 显示白屏

    在 iphone 中使用 ios8 0 以下的 UIPopovercontroller 可以正常使用此代码 但在ios8中却显示白屏 Code pickerController UIViewController alloc init UIV
  • CSS 伪元素上的事件侦听器,例如 ::after 和 ::before?

    我有一个div带有 CSS 伪元素的元素 before用作关闭按钮 而不是使用实际按钮 如何应用事件侦听器only伪元素 HTML div div CSS box before background image url close png
  • 在 Eclipse 中更改概览标尺颜色

    如何更改概览规则背景Eclipse 3 4 0 I20080617 2000 中的颜色 编辑窗口右侧的垂直条 带有一些注释 常规 gt 编辑器 gt 文本编辑器 gt 注释仅允许更改标记本身的颜色 而不是整个栏的背景 看来我的网络搜索能力越
  • Laravel afterFind 回调事件

    laravel 中是否有像 cakePHP 中那样的 afterFind 模型事件 以便我可以在任何搜索查询后格式化数据 或任何其他方式来做到这一点 Thanks 它不是一个事件 而是一个可以在模型中设置的变异器 您只需在模型中创建一个名为
  • 导出 eclipse 可部署插件和片段时出错

    我有一个 Eclipse 插件在 Eclipse 环境中运行良好 我想将其导出为 jar 文件 因此我选择了 导出 gt 可部署插件和片段 我可以得到一个jar文件 但是报告了一个错误 打开日志文件 它报告我有 1242 个问题 191 个
  • 从顶部裁剪图像

    通过设置从底部 左侧或右侧裁剪图像非常容易overflow hidden图像容器的属性 div class img container img class img src img jpg div 有没有办法从顶部裁剪图像 如果正在调整窗口大
  • 如何为react-big-calendar(fullcalendar.js)设置momentLocalizer(moment.js)?

    我在用着反应大日历 https github com intljusticemission react big calendar并需要帮助来实现所需的本地化 来自 git 的示例 import BigCalendar from react
  • 加载巨大的 XML 文件并处理 MemoryError

    我有一个非常大的 XML 文件 准确地说是 20GB 是的 我需要全部 当我尝试加载该文件时 收到此错误 Python 23358 malloc mmap size 140736680968192 failed error code 12
  • 无法在 iOS 6 中以编程方式安装 ipa 文件

    我使用 MobileInstallationInstall 在越狱 iOS 中安装 ipa 文件 在iOS5中运行良好 但在iOS6中失败 我检查了日志并发现以下内容 需要有一个名为 com apple private mobileinst
  • C 易失性变量和高速缓存

    缓存是由缓存硬件对处理器透明地控制的 因此如果我们在C程序中使用易失性变量 如何保证我的程序每次都从指定的实际内存地址读取数据而不是缓存 我的理解是 Volatile 关键字告诉编译器不应优化变量引用 而应按照代码中的编程方式读取变量引用