服务中断与服务异常

时间:2018-02-07 13:34:18

标签: exception exception-handling embedded interrupt interrupt-handling

我的理解:异步发生的中断(硬件中断)通常是由外部事件直接中断CPU引起的。然后,CPU将向特定的ISR传送以处理中断。 显然,ISR不能返回值或传递参数,因为事件在我们的代码中的任何执行点随时发生。

但是有例外,我的理解是这是一个软件中断,它是由软件中的特殊指令pd引起的。

我听说异常的处理方式与处理ISR类似。通过从代码中获取参数并返回一个值,异常处理程序在这种情况下的行为是否与ISR不同,因为我们知道在执行代码时我们在代码中的位置?

提前致谢

2 个答案:

答案 0 :(得分:1)

术语"例外"可能意味着完全不同的事情。

有"软件例外"以异常处理的形式,作为C ++等语言的高级语言特性。一个"异常处理程序"在这种情况下,就像try { } catch块一样。

还有"硬件例外"这是一些像PowerPC这样的CPU内核使用的术语。这些是对应于错误状态的关键中断的形式。一个"异常处理程序"在这种情况下,类似于中断向量表,但是当发生硬件异常时,软件通常无法做到这一点。

硬件异常不带参数,也不返回任何数据,就像中断一样。像PowerPC这样的架构将硬件中断的硬件异常分开,前者是各种错误状态,后者是来自特定应用硬件的中断。

与软件通信的硬件异常并不是那么有意义,因为它们会从执行错误的OP代码,CPU时钟坏了,失控代码等等严重故障中生成。也就是说,执行环境已被破坏,因此在该环境中执行的软件可能没有任何意义。

答案 1 :(得分:1)

硬件异常不是软件中断,您没有明确地调用它 - 它发生在某些硬件可检测的错误上,例如:

  • 无效地址
  • 无效指示
  • 无效对齐
  • 除以零

您当然可以编写代码以故意导致其中的任何一个,因此将它们用作软件中断,但是您可能会将它们的实用程序作为真正的错误陷阱而失效。在某些情况下,例外情况是用于此目的 - 例如,在架构上没有FPU的处理器中,FPU是一个选项,无效指令处理程序可用于实现FPU的软件仿真,以便编译器不需要为FPU和非FPU变体生成不同的代码。类似地,无效的地址异常可以调用内存管理器来实现虚拟内存交换文件(在具有MMU的设备上)。

SWI指令显式调用软件中断 。与简单的函数调用相比,它的好处是应用程序不需要知道处理程序的位置 - 由向量表确定,并且通常用于在简单的操作系统中进行操作系统或BIOS调用动态加载代码,但不支持动态链接(例如MS-DOS以这种方式工作)。

什么硬件中断,软件中断和异常都有共同之处在于它们在正常代码的不同处理器环境中执行 - 通常切换到独立堆栈并自动推送寄存器(或使用备用寄存器组)。它们都通过向量表进行操作,并且不能通过形式函数参数传递和返回来传递或返回参数。使用SWI和强制异常,可以将值加载到处理程序已知的特定寄存器或内存位置。

以上是一般原则 - 不同架构之间的具体细节会有所不同。请参阅所用特定设备的技术参考。

相关问题