软件中断和硬件中断的区别

4

我最近开始在ARM Cortex微控制器上工作。在阅读互联网上的不同文章时,我通常发现两个常见术语:软件中断和硬件中断。 这两者之间的实际区别是什么?你能举个例子来解释一下吗?


2
可能重复(Possible Duplicate) - izlin
4
软件中断是程序中的一条指令。硬件中断由处理器或某些连接的外部设备生成。 - Bo Persson
1
您将拥有一个中断服务例程,它必须根据某个事件执行某个操作。该事件本身可以是指令(即从您自己的代码触发),也可以是硬件事件。这就是@BoPersson所写的唯一区别。一旦触发它,如果新触发的中断的优先级高于当前正在执行的代码,则会暂停当前代码并跳转到更高优先级的中断例程。如果不是,则会引发标志,并在所有更高优先级的中断执行完成后开始执行例程。 - vgru
4个回答

9
我认为你想知道软件中断的用途和如何使用它们,而不是它们之间的区别。
让我们从软件和硬件中断的共同点开始:它们都用于从主执行上下文切换到低级中断处理程序,以执行一些低级操作 - 主要是在外设寄存器上。
硬件中断的目的是,硬件想将一些数据传递给程序(GPIO 切换、UART 上的新字符等)。这很容易理解,因为当你编写程序时,你只需要实现处理程序 - 每当硬件需要你的操作时,处理程序就会被调用。
软件中断的目的是,程序想将一些数据传递给硬件。更具体地说,它想访问一些无法从当前上下文访问的资源。这适用于常见的设计,其中我们不希望高级应用程序干扰硬件,例如直接写入闪存或更改 USB 控制寄存器,因此我们阻止它从上层进行,并将此任务委托给 OS 核心(如 Linux 内核)。核心通过软件中断从上层接收请求,执行一些与硬件有关的操作并返回响应。软件中断也可用于触发操作系统维护任务 - 例如,当当前执行的任务在互斥锁上阻塞时进行上下文切换。
这更难理解,因为与硬件中断相反,程序员必须同时实现处理程序和调用程序。
当然,我的解释是一个很大的简化,但我希望它能帮助你理解一般思想。如果你不是在实现操作系统或非常复杂的裸机应用程序,你可能根本不需要这个。而且,在使用操作系统时最好避免修改与软件中断相关的代码,因为系统可能依赖于它们。
祝你好运!

3
硬件中断是由物理信号产生的,可以来自于微控制器本身(例如作为总线控制器的一部分)或配置为中断的外部GPIO。这些中断通常与微控制器外部硬件的交互有关,例如SPI或I2C总线中发生事件时生成的中断。这些硬件中断通常通过控制寄存器的组合进行配置,这些寄存器指定了硬件行为,并且通过中断屏蔽允许在任何时间点启用或禁用某些中断。内部硬件事件(如电源事件、定时器等)也会触发中断。
软件中断是由微控制器执行的指令产生的。例如,在x86平台上,您可以使用INT3指令为调试目的引发TRAP中断。软件中断通常用作切换特权级别的一种方式,例如使用系统调用,因为在低特权模式下运行的代码可以触发一个中断,该中断在高特权模式下执行,然后适当地分派系统调用请求。
在两种情况下,中断处理程序通常使用中断向量表进行配置。中断向量只是指向处理每个中断的函数的指针。该表通常存在于微控制器的闪存或ROM空间的固定内存位置,但在许多情况下,中断表位置可以作为编程过程的一部分进行配置。通常,每种中断类型都被赋予一个数字,该数字对应于其在中断表中的索引,因此您知道要放置每个单独处理程序的向量。

3
它们都是中断,只是与来源有关。 有一些中断(这些也是信号),由指令或故障等(未定义,未对齐等)生成。 还有一些可供芯片供应商使用的中断。 ARM制造IP而不是芯片,芯片供应商提供了他们可以选择使用的许多中断。 通常它们与外围设备(例如usb,gpio,uart,spi等)绑定。
ARM叫它swi软件中断或svc。 就像x86中的软件中断数量一样,例如一个应用程序可以进行服务调用。 在全尺寸的arm上,可以在较低/最低的执行级别上执行此操作,但由更高特权模式或执行级别提供服务。 基本上允许您拥有操作系统。 可以在cortex-m上使用此功能,但它没有提供保护层,而是提供了一个通用接口,例如当您下载了rtos并想为其编写应用程序时,rtos是泛型的,应用程序是您的,可以按您希望或需要完成并可以使用此接口调用rtos(由rtos定义)。 无论是arm还是x86,调用实际上都是任意的,逻辑并不决定,软件决定,传统上,x86具有特定中断的bios处理程序,但那是任意的,您可以编写自己的bios /处理程序与传统不兼容,只要双方同意接口,它就可以正常工作,同样,arm的swi / svc调用不一定是标准的,linux可能有一个,但如果freertos不想符合它,他们就不必这样做。
在cortex-m的情况下,还有一个区别,但不一定是通用的区别也不是必需的,即所谓的外部中断虽然与核心外部相关,但通常与芯片供应商提供的项目相关联,可能具有额外的屏蔽层,因此可以使用中断控制器将它们禁用,而事件类型中断(如未定义,systick等)虽然只是信号,但不经过屏蔽层。 对于来自所有供应商(ARM,英特尔,MIPS等)的所有架构并非普遍适用,但如果我没记错的话,在cortex-m的情况下,这就是他们实现的方式。 当然,仍然会有新的核心推出,并且没有理由让它们以相同的方式设计所有核心。

0

硬件中断是由硬件触发的,例如声卡,而软件中断是由软件触发的,因为它是程序指令。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接