操作系统 ISR和函数调用的区别
在本文中,您将了解ISR与函数调用之间的区别,但在讨论区别之前,您必须简要了解ISR和函数调用。
什么是ISR
中断服务例程(ISR)是硬件在中断响应时调用的软件例程。ISR检查中断,确定如何处理它,执行它,并返回逻辑中断值。如果不需要进一步处理,则ISR通过返回值通知内核。ISR必须非常快地执行,以避免减慢设备和所有较低优先级ISR的操作。
虽然ISR可能会将数据从CPU寄存器或硬件端口移动到内存缓冲区,但通常情况下,它依赖于专用的中断线程(或任务),称为中断服务线程(IST),来执行大部分所需的处理。如果需要额外的处理,则ISR将返回一个逻辑中断值给内核。然后,它将物理中断号映射为逻辑中断值。
中断处理机制
以下是中断处理的机制,包括以下步骤:
- 中断是一种条件,使CPU暂停当前程序并执行ISR。ISR是一个专门编写的程序,用于处理引发中断的条件。
- 在服务完中断后,CPU会返回到主程序,恰好在离开时的下一条指令处继续执行。
- 在中断驱动的数据传输中,每当I/O设备准备好进行数据传输时,它会中断CPU。在ISR中,CPU将执行数据传输。
- 这种方法优于轮询,因为CPU不必在检查I/O设备状态上浪费时间。键盘是中断驱动I/O访问的典型例子。
- 键盘不应该检查CPU,而应在按下键时中断CPU。因此,当用户根本不键入时,不会浪费时间反复检查键盘。
- I/O设备通过向CPU发送 $\overline{INTR}$ 信号来请求中断。
- 当CPU接收到 $\overline{INTR}$ 信号时,它会完成当前指令的执行,然后执行ISR。当CPU准备好时,它通过 INTA 线发送确认信号。
- ISR得到执行,CPU返回到主程序。
- I/O设备在执行后关闭 $\overline{INTR}$ 信号。
例如: 在下面的示例中,通过中断驱动的I/O进行I/O传输。
- 如果一个I/O设备想要与处理器执行数据传输,必须中断处理器。
- 中断是一种使处理器执行中断服务例程的条件。
- 在ISR中,处理器将与I/O设备进行数据传输。
在这个例子中,通过按下键盘键发出中断请求,
- 在处理器检查按键是否按下的地方,键盘在按下键时中断处理器。
- 在键盘的ISR中,这是键盘驱动程序的一部分,处理器将从键盘读取数据。
ISR的优势
下面是ISR的一些优势,例如:
- 在程序执行过程中,ISR异步事件可以随时发生。
- ISR会将PC、Flags和寄存器保存在堆栈上,禁用所有中断,并加载ISR的地址。
- ISR不能有可以传递给它的参数。
- ISR不能返回值。
- ISR启用中断。
- 通常情况下,ISR较小,因为它占用了其他进程的时间。
- 一些ISR有自己的堆栈。
函数调用是什么
函数调用也被称为子程序调用。子程序是程序重复需要的一组指令。它是一个较大程序的一部分,负责执行特定的任务。较大程序可能执行重负载,而子程序可能只执行一个简单的任务,这也与其余程序编码无关。
函数的编码方式可以被多次调用,可以从不同的位置调用(甚至从其他函数内部调用)。当调用函数时,处理器可能会移动到函数代码所在的位置,并逐个执行函数的指令。在完成函数后,处理器将返回到离开的位置,从下一条指令开始继续执行。
函数是代码重用的一个很好工具。许多现代编程语言支持函数。一组函数被称为一个 库 。库通常被用作分享和交易软件的方式。在某些情况下,整个程序可以是一系列子程序的序列。
在8086处理器的情况下,通过 CALL 指令调用子程序,并通过 RET 指令返回控制。这减小了程序的大小。
ISR和函数调用的区别
函数必须显式调用,并且与其调用者处于相同的上下文和执行线程中。硬件ISR不是显式调用,而是由某些外部事件调用的。当中断调用时,当前线程的上下文在切换到ISR之前会自动保存下来。
相反,将发生反向上下文切换,将处理器的状态恢复到中断之前的状态,以便从中断点继续执行。下面是ISR和函数调用之间的一些更多区别。
ISR | 函数调用 |
---|---|
中断通常由内部或外部信号的微处理器发起,而不是执行指令。ISR在将程序的当前状态存储到堆栈后执行。 ISR根据中断设备或程序员编写的指令执行不同的任务。 | 函数调用是通过执行指令来调用的,该指令执行特定的任务并减小程序的大小。 |
硬件确定ISR的地址。 ISR地址写在中断向量表内,并且每个中断的ISR地址都是固定的。 | 子程序的地址写在指令内部,该指令写在主程序代码内部。 |
ISR用于所有通用任务。 | 函数调用用于特定程序任务。 |
当在执行当前程序时发生中断,因此在执行当前指令后,处理器执行ISR。执行ISR后,处理器必须恢复程序,就像中断发生之前一样。 为此,PC内容、µP寄存器和一些状态条件被存储下来。微处理器中的所有状态位条件的集合被称为PSW(程序状态字)。
在中断周期内,PC和PSW的内容被推送到堆栈上。然后,将特定中断的分支地址传递给PC,并将新的PSW加载到状态寄存器中。 |
这里只有一个PC被存储在堆栈中,以获取主程序中下一条指令的地址。 子程序必须能够访问来自调用子程序的数据并将结果返回给该子程序。因此,需要进行子程序参数和数据链接。 这可以通过以下方式完成:
AC寄存器可以用于单个输入参数和单个输出参数。在具有多个处理器寄存器的计算机中,可以以这种方式传递更多参数。 |