ISR 和函数调用之间的区别?

2023-12-24

我想了解ISR(中断服务例程)和函数调用之间的区别。

我觉得从硬件角度来看,函数调用和 ISR 是相同的。如果我错了,请纠正我。 我能找到的有关 ISR 和函数调用的所有信息如下:

ISR:

  • 执行过程中随时可能发生的异步事件 该程序

  • 将 PC、标志和寄存器保存在堆栈上 禁用所有中断并加载 ISR 的地址

  • ISR 不能有可传递给它的参数

  • 无法返回值
  • 启用中断
  • 通常很小,因为它们占用了其他进程的时间
  • 一些 ISR 有自己的堆栈

功能:

  • 当有函数调用时发生

  • 将 PC 和寄存器保存在堆栈上

  • 可以有争论

  • 可以返回值

  • 对执行的大小和持续时间没有限制

除此之外还有什么不同吗?请告诉我。 我还读过有关 ISR 的函数调用是如何发生的。请突出显示它。


因此,在断言它们是相同的之后,您继续列出它们不同的方式 - 这也许可以回答您的问题。

您关于 ISR 的前四点是广泛且普遍正确的。关于启用中断的要点不一定是这种情况,而是程序员的实现决策,并且可能由体系结构决定,并且小是指导方针而不是要求——“小”完全是主观的”。

差异并不在于它们的编码方式(尽管 ISR 通常会施加许多限制,并且还可能具有普通函数没有的特权),而在于它们的调用方式和处理器的行为。

函数(或者更一般的过程或子例程)必须显式调用,并且与其调用者属于同一上下文和执行线程。硬件 ISR 不是显式调用的,而是由某些外部事件调用的(处理器内核外部,即片上外设可能会生成中断)。当调用中断时,在将上下文切换到 ISR 之前,会自动保留当前线程的上下文。返回时,反向上下文切换会恢复中断之前处理器的状态,以便从中断点继续执行。

该机制可能因多线程操作系统或调度程序的存在而变得复杂,其中 ISR 本身可能会导致线程上下文切换,以便在从 ISR 返回时切换到不同的执行线程或上下文。此类机制是受管理的在这种情况下由操作系统。

某些处理器还支持另一种 ISR——软件中断。软件中断的使用类似于函数调用,因为它是由指令而不是单个事件显式调用的,但它提供了一种间接机制,调用者不需要知道 ISR 的地址,而且该地址实际上可能会改变。从这个意义上说,它与通过指针调用函数没有什么不同,但因为它是一个 ISR,所以它在中断上下文中运行,而不是调用者的上下文,因此可能具有普通函数没有的限制和特权。

从根本上讲,中断能够直接且确定地响应事件,否则您可能会轮询或测试事件然后处理它,但只能在您选择测试它时而不是在其实际发生时处理它,这可能是可变且长得令人无法接受。

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

ISR 和函数调用之间的区别? 的相关文章

随机推荐

  • JavaScript 查询选择器全部

    我正在编写的教程包含以下代码和以下注释 我不明白 i 评论 特别是为什么它说 所有第二个表格单元格 第二 是什么意思 这不是正确的英语 ii 当它说的时候 它到底在寻找什么td td 该程序是关于从表中获取数据 所以td td选择 html
  • JPA 多重联接

    我有这些课程 class Project ManyToOne Company owner ManyToMany Set
  • 光滑的滑块转到第一张幻灯片

    Slick 滑块设置为自动播放 播放时 幻灯片从左到右或从第一个到最后一个 当滑块到达最后一张幻灯片时 它将开始从最后一张幻灯片向后自动播放到第一张幻灯片 我希望当滑块到达最后一张幻灯片时 滑块从第一张幻灯片开始播放 而不是从最后一张幻灯片
  • 如何使用 sqlcmd 运行 sql 脚本文件并输出到 shell 和文件

    我正在尝试使用以下命令从文件运行 sql 脚本sqlcmd 使用以下命令 sqlcmd S
  • Ruby 中 $stdout 和 STDOUT 之间的区别

    在 Ruby 中 有什么区别 stdout 前面有美元符号 和STDOUT 全部大写 在进行输出重定向时 应该使用哪个以及为什么 同样适用于 stderr and STDERR Edit 刚刚找到一个相关问题 https stackover
  • 该结构的初始序列是什么?

    我遇到了最初的序列概念 通过标准搜索initial sequence短语只给出 3 个结果 并且没有给出定义 Section N3797 9 5 1 class union 如果标准布局联合包含多个标准布局结构 有着共同点的初始序列 9 2
  • Python CGI os.system 导致标头格式错误

    我正在运行 Apache 2 4 10 Raspbian 并且我正在使用 python 作为 CGI 但是当我尝试在简单代码中使用 os system 时 我收到此格式错误的标头错误 Wed Aug 31 17 10 05 715740 2
  • Visual Studio 2012 Ultimate 编辑 C# 代码时速度缓慢

    我检查了许多有关禁用图形加速 关闭 IntelliTrace 和使用 Sysinternals Process Monitor ProcMon 的文章 但我不知道如何找出导致我的编辑器速度慢得离谱的原因 ProcMon 显示 devenv
  • 最优算法是完整算法吗?

    我确实理解 完整的算法是一种如果有解决方案 该算法能够找到它的算法 而最佳算法是一种能够找到成本最低的解决方案的算法 但最优算法就是完整算法吗 可以简单解释一下吗 Thanks 是的 根据定义 寻找最优解需要证明最优性 这可以通过找到所有解
  • 插入符号位置不跟踪?

    我想做的是将关键代码放入一个数组中 以便稍后做一些有趣的事情 因此 我捕获击键 获取插入符位置并将关键代码放入数组中 在 MooTools 的帮助下 var keyArray form addEvent keyup function eve
  • 从html表单的下拉框中获取选定的值而不提交

    如何从html表单的下拉框元素中获取所选项目的文本 使用Python 当我使用鼠标从下拉框中选择一项时 如何将值存储到变量中 即不使用提交按钮 这是针对我在仅支持 Python 的应用程序引擎中执行的应用程序 你的问题表明对如何进行一些误解
  • 为什么某些 xlims 和 ylims 在 ggplot 和 sf 中产生此错误?

    我正在学习使用 ggplot 和 sf 来处理空间数据 当我尝试绘制以下图时 出现错误 library sf library ggplot2 library rnaturalearth library rnaturalearthdata w
  • 如何将文件路径数组转换为分层 JSON 结构

    我正在尝试根据给定的所有文件和路径的数组创建机器目录结构的 JSON 该数组看起来像这样 string dirArray proc 15 task 15 exe proc 15 task 15 mounts mounts xml proc
  • Qt 的 Bullseye 代码覆盖率

    嘿 我面临着有关 Qt 的靶心代码覆盖率的问题 在我的 pro 文件中 我添加以下内容 QMAKE CC C Program Files x86 BullseyeCoverage bin cl QMAKE CXX QMAKE CC QMAK
  • Chrome 扩展:如何在同一选项卡中打开 popup.html 中的网址

    谷歌浏览器扩展程序 我为一件简单的事情而发疯 请不要责怪我 我不是英语出身 我很难阅读和理解所有扩展文档 我只想执行以下操作 我的 popop html 中有 8 个不同的 URL 当我点击右上角浏览器栏中的图标时 它会打开 网址 exam
  • Go 是否可以在不为每个外部进程启动一个操作系统线程的情况下生成并与外部进程通信?

    简洁版本 Golang 是否可以生成多个外部进程 shell 命令 在平行下 这样它就不会启动一个操作系统线程每个外部进程 并且在完成后仍然能够接收其输出 更长的版本 在 Elixir 中 如果使用端口 则可以生成数千个外部进程 而无需真正
  • 如何删除/修复幽灵工作区

    不知何故 我最终得到了一个 幽灵 工作空间 它不会显示在 Visual Studio 中的 管理工作区 下 当我连接到 VS Team Services 和开源控件资源管理器时 它会弹出一个错误对话框 其中包含 TF14061 工作区不存在
  • C++ 对字符文字的顺序有何保证?

    C 对字符文字的顺序有何保证 中的字符有一定的顺序吗基本源字符集 例如是 a lt z 保证是真的吗 怎么样 A lt z 该标准仅提供十进制数字排序的保证0 to 9 来自 C 11 标准草案部分2 3 lex charset 在源和执行
  • OpenCV Sift/Surf/Orb:drawMatch 函数无法正常工作

    我使用 Sift Surf 和 ORB 但有时我在使用 drawMatch 函数时遇到问题 这里的错误 OpenCV 错误 drawMatches 中断言失败 i2 gt 0 i2 0 i2 代码 drawMatchPoints img1
  • ISR 和函数调用之间的区别?

    我想了解ISR 中断服务例程 和函数调用之间的区别 我觉得从硬件角度来看 函数调用和 ISR 是相同的 如果我错了 请纠正我 我能找到的有关 ISR 和函数调用的所有信息如下 ISR 执行过程中随时可能发生的异步事件 该程序 将 PC 标志