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

2023-12-02

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

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

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


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

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

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

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

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

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

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

  • 检查空参数的最佳方法(保护子句)

    例如 您通常不希望构造函数中的参数为空 因此看到类似的内容是很正常的 if someArg null throw new ArgumentNullException nameof someArg if otherArg null throw
  • Windows 上使用 g++ 的 Makefile,链接库

    我已经厌倦了 MSVC 6 以及每个人总是告诉我它是一个蹩脚的编译器等等 所以现在我决定尝试使用 vim 加 g 和 makefile 这是我的问题 我有以下 makefile This is supposed to be a commen
  • MVC 重定向到没有控制器的视图

    希望应该是一个简单的 我创建了一个通用错误视图 当整个站点的操作方法内发生异常时 我想显示该视图 我创建了一个部分页面 所有导航都位于其中 因此我不需要在此视图上使用控制器 那么如何从控制器内的操作方法重定向到它 像这样的东西 HttpPo
  • C修改printf()输出到文件

    有没有办法修改printf为了将字符串输出到文件而不是控制台 我尝试在互联网上查找一些内容 发现了类似的电话dup dup2 and fflush这可能与此有关 EDIT 也许我不清楚 问题是这是C考试问题 问题如下 解释一个通常将字符串输
  • 为什么opencv videowriter这么慢?

    你好 stackoverflow 社区 我有一个棘手的问题 我需要你的帮助来了解这里发生了什么 我的程序从视频采集卡 Blackmagic 捕获帧 到目前为止 它工作得很好 同时我用 opencv cv imshow 显示捕获的图像 它也工
  • 没有 Unicode 字节顺序标记。无法切换到 Unicode

    我正在使用 XSD 编写 XML 验证器 下面是我所做的 但是当验证器到达该线时while list Read 它给了我错误 没有 Unicode 字节顺序标记 无法切换到 Unicode 有人可以帮我解决吗 public class Va
  • 在运行时设置 DataGridView 上的 DataFormatString?

    是否可以在运行时设置 ASP NET DataGridView 中的列或单元格的 DataFormatString 属性 这应该有效 BoundField priceField grid Columns 0 as BoundField pr
  • 通过引用传递时取消引用指针

    当通过引用传递给函数时取消引用指针时会发生什么 这是一个简单的例子 int returnSame int example return example int main int inum 3 int pinum inum std cout
  • 如何在 Windows 窗体中运行屏幕保护程序作为其背景?

    如何在 Windows 窗体中运行屏幕保护程序作为其背景 用户还可以在屏幕保护程序运行时与表单控件进行交互 为什么这个 我们有一个案例 需要在用户时运行 Windows Bubbles 屏幕保护程序 可以继续与表单控件交互吗 您可以使用以下
  • 使用 openssl 检查服务器安全协议

    我有一个框架应用程序 它根据使用方式连接到不同的服务器 对于 https 连接 使用 openssl 我的问题是 我需要知道我连接的服务器是否使用 SSL 还是 TLS 以便我可以创建正确的 SSL 上下文 目前 如果我使用错误的上下文尝试
  • 指示泛型返回动态类型的对象

    这个问题是我原来问题的后续问题here https stackoverflow com questions 2541184 using a type object to create a generic 假设我有以下泛型类 简化 class
  • 从包含大量文件的目录中检索文件

    我的目录包含近 14 000 000 个 wav 格式的音频样本 所有普通存储 没有子目录 我想循环浏览文件 但是当我使用DirectoryInfo GetFiles 在该文件夹上 整个应用程序冻结了几分钟 可以用另一种方式完成吗 也许读取
  • 如何在 VS Code 中为 CMake 项目设置 C/C++ IntelliSense?

    我正在尝试使用 libTooling 编写一个工具 我对其进行了设置 以便它可以使用 LLVM 文档中的示例进行编译 然而 C C IntelliSense 似乎不适用于 CMake 项目 我的工具位于
  • C++ 标准中短语“构造函数没有名称”的含义

    在尝试理解 C 标准中的 构造函数没有名称 这句话时 我似乎在 clang 中发现了一个错误 有人可以证实这一点吗 VS2015 and gcc rejects this code and I think they it are is co
  • 展开路径中具有环境变量的文件名

    最好的扩张方式是什么 MyPath filename txt to home user filename txt or MyPath filename txt to c Documents and settings user filenam
  • 如何将 CSV 文件读入 .NET 数据表

    如何将 CSV 文件加载到System Data DataTable 根据CSV文件创建数据表 常规 ADO net 功能是否允许这样做 我一直在使用OleDb提供者 但是 如果您正在读取具有数值的行 但希望将它们视为文本 则会出现问题 但
  • 正在获取“未终止 [] 设置”。 C# 中的错误

    我正在 C 中使用以下正则表达式 Regex find new Regex url
  • 如何使用 ASP.NET Web 表单从代码隐藏中访问更新面板内的文本框、标签

    我在更新面板中定义了一些控件 它们绑定到中继器控件 我需要根据匿名字段隐藏和显示用户名和国家 地区 但问题是我无法以编程方式访问更新面板中定义的控件 我如何访问这些控件 我也在网上查找但找不到很多参考资料 下面是来自aspx页面和 cs页面
  • 程序退出后,TcpListener Socket 仍处于活动状态

    当我的程序退出时 我试图停止 TCP 侦听器 我不关心套接字或任何活动客户端套接字上当前活动的任何数据 套接字清理代码本质上是 try myServer Server Shutdown SocketShutdown Both catch E
  • 在何处将 CFLAG(例如 -std=gnu99)添加到 (Eclipse CDT) 自动工具项目中

    我有一个简单的 Autotools C 项目 不是 C 其框架是由 Eclipse CDT Juno 为我创建的 CFLAG 通过检查 似乎是 g O2 我希望所有生成的 make 文件也具有 std gnu99附加到 CFLAG 因为我使

随机推荐

  • 在 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