什么时候需要在 ISR 中使用 volatile?

2023-12-02

我正在制作嵌入式固件,初始化后的所有事情都发生在 ISR 中。我有它们之间共享的变量,我想知道在什么情况下它们需要是易失性的。我从不阻塞,等待另一个 ISR 的变化。

在不使用易失性的情况下,什么时候可以确定实际内存已被读取或写入?每个 ISR 一次?

附录:
这是针对 ARM Cortex-M0 的,但这实际上并不是一个关于 ISR 的问题,而是一个关于编译器优化的问题,因此,平台实际上并不重要。


这个问题是完全可以回答的,而且答案很简单:

如果没有易失性,您(简单地)不能假设实际的内存访问将ever发生 - 编译器可以自由地得出结论,结果要么完全未使用(如果在它可以看到的内容中很明显),要么它们可以安全地缓存在寄存器中,或者乱序计算(只要visible依赖关系得到维护)。

您需要 挥发性 来告诉编译器访问的副作用对于优化器无法分析的东西可能很重要,例如中断上下文或不同“线程”的上下文。

实际上,易失性就是你对编译器说的“我知道一些你不知道的事情,所以不要在这里耍小聪明”

小心易变的does not保证读取-修改-写入的原子性,甚至在数据类型(或其未对齐)需要多步访问的情况下保证单独读取或写入的原子性。在这些情况下,您不仅面临获得陈旧值的风险,而且还面临完全错误的风险。

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

什么时候需要在 ISR 中使用 volatile? 的相关文章

随机推荐

  • 在 Teams 平台上更新 BotFramework v4 中的活动

    我有一个使用 NodeJS 使用 Bot Framework v4 开发的机器人 并部署在 Teams 中的多个渠道上 有没有办法更新机器人发送的消息 我尝试在 BotFrameworkAdapter 中实现 updateActivity
  • cx_Freeze-导入错误:无法导入名称设置

    我使用的是 Windows 7 机器 cx Freeze 4 3 1 和 Python 3 3 Python 和 cx Freeze 都是 32 位版本 我编写了一个 setup py 脚本 如下所示 import sys from cx
  • Javascript如何转义字符

    我想在 div 中插入一些 html 假设 div div 我在用 Sag html data 为了将数据插入到该 div 中 但这是我的数据的问题 table table
  • android 中有安装事件吗?

    是否有一些事件 接收器或用于处理安装后或安装后直接执行的首次执行 或者我需要它根据偏好进行模拟吗 有的是ACTION PACKAGE ADDED广播意图 但正在安装的应用程序不会收到此意图 因此 检查是否设置了首选项可能是最简单的解决方案
  • 按位与 (&) 运算符执行什么数学函数(JS)?

    一点背景知识 当我试图解决 javascript 问题以找到所有可能的子集时 我正在查看另一篇 SO 帖子 我不是在问 JS 挑战 而是问它为什么存在以及它有什么数学意义 这是代码的复制粘贴这个帖子 var arr 1 2 3 functi
  • 如何在基于 MSI 的卸载过程中停止正在运行的进程?

    我在 Windows XP 上使用 Wise Package Studio 7 0 SP2 我有一个 MSI 包装的 EXE 安装 它可以愉快地安装一些文件 然后运行安装中的其中一个文件 我们可以将其称为 app exe 因此 在 MSI
  • 在多索引 DataFrame 中添加和重命名列

    这篇文章的目的是了解如何将列添加到MultiIndex DataFrame using apply and shift 创建数据框 import pandas as pd df pd DataFrame 5777 100 5385 200
  • YouTube API v3 点赞视频,但计数器不增加

    每当我尝试通过 YouTube API 点赞某个视频时 它都会将该视频标记为点赞 但点赞计数器不会在我点赞时增加 它告诉我我喜欢这个视频 因为喜欢按钮是全绿色的 但它并没有算作喜欢 我通过 PHP 的 CURL 使用此链接 https ww
  • python selenium无法使用cookie登录youtube帐户

    警告 此线程中提供的 cookie 可能已经无效 因此您应该使用您自己的或其他一些 cookie 来执行此操作 我需要使用以下方式登录我的 YouTube 帐户饼干和硒 我可以发送请求至https www youtube com 与饼干 它
  • boost::random::uniform_real_distribution 在处理器之间应该是相同的吗?

    以下代码在 x86 32 位和 64 位处理器上产生不同的输出 应该是这样吗 如果我将其替换为 std uniform real distribution 并使用 std c 11 进行编译 它将在两个处理器上产生相同的输出 include
  • 分段错误取决于字符串长度?

    我正在编写一个程序 它将使用 getline 从 infile 读取行并将其转换为字符串 将字符串转换为包含字符串的前 m 个非空白字符的 c 字符串 然后将 c 字符串连接成单个 char 数组 示例文件可能如下所示 5 number o
  • 在 C# 中从 HTML 表中检索数据

    我想从 HTML 文档中检索数据 我正在从一个几乎完成的网站上抓取数据 但在尝试从表中检索数据时遇到问题 这是 HTML 代码 div div
  • CASE 相当于嵌套 IIF 语句

    谁能将以下嵌套 IIF 解码为 SQL 中的 CASE 语句 我知道 SQL Server 2012 中允许使用 IIF 但我发现很难轻松掌握嵌套 IIF 逻辑 以下是我的嵌套 IIF 语句 IIF IIF TABLE A Col 1 0
  • pkg-config:未找到命令,在 Windows 7 上使用 cygwin

    我在 Windows 上使用 Cygwin 来运行此命令 g pkgconfig libs cflags opencv I o mergevec mergevec cpp 但我收到一个错误 bash pkg config command n
  • 如何捕获 ES6 Promise 拒绝并完全停止流程?

    假设我有 4 个功能 runA runB runC and runD 使用 ES6 Promise 在一次完全成功的运行中 这些都将依次运行 runA then runB then runC then runD If runA or run
  • 命令超时和连接超时之间的区别

    连接超时和命令超时有什么区别 在我们的应用程序中有时会显示超时错误 当我们将命令超时值增加到 100 默认为 30 时 它就可以工作了 增加命令超时值是否有任何问题 Thanks Mahesh ConnectionTimeout 是您的代码
  • PHP - 正确检查 $_POST['variable'] 是否已发布

    我想检查 POST submit 是否已发布 我原来的代码是 if POST submit 但我有一个带有此代码的 PHP 通知 未定义索引 提交于 因此 要删除该通知 我必须这样写 if isset POST submit 但这是没有意义
  • XGBoost:将 dmatrix 转换为 numpy.array

    我想检查一下DMatrix目的 这文档提到获取行数和列数以及每行切片的方法 dmatrix slice index 但我想使用 numpy 进行更复杂的转换 有没有简单的方法可以转换DMatrix到一个 numpy 数组 DMatrix 是
  • Laravel 更快地查询控制器或视图中的所有内容

    查询控制器中的所有内容并返回每个查询更快 还是在使用视图时查询更快 假设所有模型都有关系 Example 完成控制器中的所有操作然后返回 Public function articlesHome id art Articles find i
  • 什么时候需要在 ISR 中使用 volatile?

    我正在制作嵌入式固件 初始化后的所有事情都发生在 ISR 中 我有它们之间共享的变量 我想知道在什么情况下它们需要是易失性的 我从不阻塞 等待另一个 ISR 的变化 在不使用易失性的情况下 什么时候可以确定实际内存已被读取或写入 每个 IS