【问题标题】:Difference between Software and Hardware Interrupts软件和硬件中断的区别
【发布时间】:2017-11-15 13:21:20
【问题描述】:

我最近开始研究 ARM Cortex 微控制器。在互联网上阅读不同的文章时,我通​​常会发现两个常用术语,即软件中断和硬件中断。 两者的实际区别是什么?可以举个例子解释一下吗?

【问题讨论】:

  • 软件中断是程序中的一条指令。处理器或某些连接的外部设备会生成硬件中断。
  • 您将有一个中断服务程序,它必须根据特定事件执行特定操作。事件本身可以是指令(即从您自己的代码触发)或硬件事件。正如@BoPersson 所写,这是唯一的区别。而一旦你触发了它,如果这个新触发的中断的优先级高于当前正在执行的代码,它就会暂停当前代码并跳转到更高优先级的中断程序。如果没有,则会产生一个标志,并且当所有更高优先级的中断都执行完时,例程将开始执行。

标签: c embedded embedded-linux interrupt-handling interrupted-exception


【解决方案1】:

我认为您试图弄清楚软件中断需要什么以及如何使用它们,而不是区别。

让我们从软件中断和硬件中断的共同点开始:它们都用于从主执行上下文切换到低级中断处理程序,以便执行一些低级操作 - 主要在外围寄存器上。

硬件中断开关的目的是硬件想要将一些数据传递给程序(GPIO切换,新字符在 UART 上到达等)。这很容易理解,因为当您编写程序时,您需要做的就是实现处理程序——只要硬件需要您的操作,就会调用处理程序。

软件中断开关的目的是程序想要将一些数据传递给硬件。更具体地说,它想要访问一些无法从当前上下文访问的资源。它适用于通用设计,我们不希望高级应用程序与硬件混淆,例如直接写入闪存或更改 USB 控制寄存器,因此我们从上层阻止它并将此任务委托给 OS 内核(如 linux 内核)。内核通过软件中断从上层接收请求,执行一些与硬件相关的操作并返回响应。 软件中断也可用于触发操作系统维护任务 - 例如当前执行的任务块在互斥体上时的上下文切换。

这更难理解,因为与硬件中断相反,程序员必须同时实现处理程序和调用程序。


当然我的解释是一个很大的简化,但我希望它可以帮助你理解大体的想法。如果你没有实现你的操作系统或非常复杂的裸机应用程序,你可能根本不需要这个。并且在使用操作系统时应该避免修改与软件中断相关的代码,因为系统可能会依赖它们。

祝你好运!

【讨论】:

    【解决方案2】:

    硬件中断由物理信号产生,可以来自微控制器本身(例如,作为总线控制器的一部分),也可以来自配置为中断的外部 GPIO。这些中断通常与与微控制器外部硬件的交互有关,例如当总线上发生事件时产生 SPI 或 I2C 总线中断。这些硬件中断通常通过指定硬件行为的控制寄存器和允许在任何时间点启用或禁用某些中断的中断屏蔽的组合来配置。电源事件、定时器等内部硬件事件也会触发中断。

    软件中断由微控制器执行的指令产生。例如,在 x86 平台上,您可以使用 INT3 指令引发 TRAP 中断以进行调试。软件中断通常用作切换特权级别的一种方式,例如使用系统调用,因为在低权限模式下运行的代码可以触发在高权限模式下执行的中断,然后可以适当地分派系统调用请求。

    在这两种情况下,通常使用中断向量表配置中断处理程序。中断向量只是指向处理每个中断的函数的指针。该表通常存在于微控制器闪存或 ROM 空间中的固定存储器位置,但在许多情况下,可以将中断表位置配置为编程过程的一部分。通常,每种中断类型都有一个与其在中断表中的索引相对应的编号,因此您知道将每个处理程序的向量放在哪里。

    【讨论】:

      【解决方案3】:

      它们都是与源有关的中断。有一些由指令或故障等(未定义、未对齐等)产生的中断(这些也是信号)。还有一些可供芯片供应商使用。 ARM 制造 IP 而不是芯片,芯片供应商提供了许多中断,他们可以根据需要选择使用它们。它们通常与 USB、gpio、uart、spi 等外围设备相关联。

      ARM 有一个叫做 swi 软件中断或 svc。就像 x86 中的软中断数量一样,这例如是为了让应用程序可以进行服务调用。在全尺寸的手臂上,这可以在较低/最低的执行级别上执行,但由更高的特权模式或执行级别提供服务。基本上让你有一个操作系统。可以在 cortex-m 上使用此功能,但没有保护层,它提供了一个通用接口,例如,当您下载了一个 rtos 并想为它编写应用程序时,rtos 是通用的,应用程序是你的想要或需要完成并可以使用此接口调用 rtos(由 rtos 定义)。无论是 arm 还是 x86,调用都是任意的,逻辑没有规定,软件规定,传统上 x86 具有用于特定中断的 bios 处理程序,但这是任意的,您可以编写自己的 bios/handler 与传统不兼容,它会工作只要双方在接口上达成一致就可以了,同样swi/svc对arm的调用不一定是标准,linux可能有,但freertos如果不想遵守,也不必遵守。

      cortex-m 的另一个区别,但不一定是普遍的区别,也不是必需的,是所谓的外部中断,它在内核外部但通常与芯片供应商提供的项目相关联,具有或可能有一个额外的屏蔽层,以便您可以使用中断控制器禁用它们,其中事件类型中断(如 undefined、systick 等)虽然只是信号,但不会通过屏蔽层。并非所有供应商(arm、intel、mips 等)的所有架构都普遍适用,但如果我没记错的话,就 cortex-m 而言,这就是他们实现它的方式。当然,还会有新的内核出现,他们没有任何理由以相同的方式设计所有内核。

      【讨论】:

        【解决方案4】:

        硬件中断是由声音芯片等硬件触发的,而软件中断是由软件触发的,因为它是程序指令

        【讨论】:

          猜你喜欢
          • 2017-05-25
          • 1970-01-01
          • 1970-01-01
          • 2021-12-29
          • 1970-01-01
          • 2017-03-22
          • 2010-09-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多