Embedded Systems 简明教程

Embedded Systems - Interrupts

中断是由硬件或软件发出的信号,指示需要立即注意的事件。每当中断发生时,控制器都会完成执行当前指令,并开始执行一个 Interrupt Service Routine (ISR) 或 Interrupt Handler 。ISR 会告诉处理器或控制器在中断发生时做什么。中断可以是硬件中断或软件中断。

Hardware Interrupt

硬件中断是从外部设备(如磁盘控制器或外部外围设备)发送到处理器的电子警报信号。例如,当我们在键盘上按一个键或移动鼠标时,它们会触发硬件中断,导致处理器读取击键或鼠标位置。

Software Interrupt

软件中断是由特殊情况或指令集中的特殊指令引起的,当它们被处理器执行时会引起中断。例如,如果处理器的算术逻辑单元运行一个将数字除以零的命令,从而导致除以零异常,从而导致计算机放弃计算或显示错误消息。软件中断指令的工作方式类似于子例程调用。

What is Polling?

持续监视的状态被称为 polling 。微控制器持续检查其他设备的状态;在执行此操作时,它不执行任何其他操作,并消耗所有处理时间来进行监视。可以通过使用中断来解决此问题。

在中断方法中,控制器仅在发生中断时响应。因此,不需要控制器定期监视接口和内置设备的状态(标志、信号等)。

Interrupts v/s Polling

以下是将中断与轮询区别开来的类比 −

Interrupt

Polling

中断就像一个 shopkeeper 。如果人们需要服务或产品,他们会去找他并让他了解他们的需求。在中断的情况下,当收到标志或信号时,它们会通知控制器需要对它们进行服务。

轮询方法就像一个 salesperson 。销售人员挨家挨户拜访,要求购买产品或服务。类似地,控制器会持续逐个监视所有设备的标志或信号,并向需要其服务的任何组件提供服务。

Interrupt Service Routine

对于每个中断,都必须有一个中断服务例程 (ISR) 或 interrupt handler 。当发生中断时,微控制器会运行中断服务例程。对于每个中断,内存中都有一个固定位置,用于保存其中断服务例程 ISR 的地址。为保存 ISR 地址而留出的内存位置表称为中断向量表。

executing program

Interrupt Vector Table

在 8051 中,包括 RESET 在内有六个中断。

Interrupts

ROM Location (Hex)

Pin

Interrupts

ROM Location (HEX)

串行 COM(RI 和 TI)

0023

Timer 1 interrupts(TF1)

001B

外部硬件中断 1(INT1)

0013

P3.3 (13)

外部硬件中断 0(INT0)

0003

P3.2 (12)

Timer 0 (TF0)

000B

Reset

0000

9

  1. 当复位引脚被激活时,8051 跳转到地址位置 0000。这是上电复位。

  2. 为定时器设置了两个中断:一个用于定时器 0,另一个用于定时器 1。在中断向量表中,内存位置分别为 000BH 和 001BH。

  3. 为硬件外部中断设置了两个中断。端口 3 中的引脚编号 12 和引脚编号 13 分别用于外部硬件中断 INT0 和 INT1。在中断向量表中,内存位置分别为 0003H 和 0013H。

  4. 串行通信有一个中断,它属于接收和发送。内存位置 0023H 属于此中断。

Steps to Execute an Interrupt

当一个中断变得活跃时,微控制器将经历以下步骤 −

  1. 微控制器关闭当前执行的指令,并将下一条指令(PC)的地址保存在堆栈中。

  2. 它还内部保存了所有中断的当前状态(即,不在堆叠中)。

  3. 它跳转到中断向量表中的内存位置,其中保存了中断服务例程的地址。

  4. 微控制器从中断向量表获取 ISR 的地址并跳转到它。它开始执行中断服务子例程,该子例程是 RETI(从中断返回)。

  5. 在执行 RETI 指令后,微控制器返回到被中断的位置。首先,它通过将堆栈的顶部字节弹出到 PC 中,从堆栈中获取程序计数器(PC)地址。然后,它开始从该地址执行。

Edge Triggering vs. Level Triggering

中断模块有两种类型——电平触发或边沿触发。

Level Triggered

Edge Triggered

无论何时断源电平被声明,则电平触发中断模块总会产生中断。

仅当边沿触发中断模块检测到中断源的声明边沿时,它才会产生中断。当中断源电平实际改变时,会检测到边沿。它还可以通过周期性采样来检测,并在前一个样本被取消声明时检测到声明的电平。

如果在固件中断处理程序处理中断时中断源仍被声明,则中断模块将重新生成中断,从而导致再次调用中断处理程序。

无论中断源如何工作,都可以立即操作边沿触发中断模块。

电平触发中断对于固件来说很麻烦。

边沿触发中断保持固件的代码复杂性低,减少固件的条件数量,并在处理中断时提供更大的灵活性。

Enabling and Disabling an Interrupt

复位后,即使所有中断都被激活,所有中断也会被禁用。必须使用软件启用中断,以便微控制器响应这些中断。

IE(中断使能)寄存器负责启用和禁用中断。IE 是一个可寻址寄存器。

Interrupt Enable Register

EA

-

ET2

ES

ET1

EX1

ET0

EX0

  1. EA − Global enable/disable.

  2. - − Undefined.

  3. ET2 − 启用定时器 2 中断。

  4. ES − 启用串口中断。

  5. ET1 − 启用定时器 1 中断。

  6. EX1 − 启用外部 1 中断。

  7. ET0 − 启用定时器 0 中断。

  8. EX0 − 启用外部 0 中断。

要启用中断,我们会执行以下步骤 −

  1. IE 寄存器 (EA) 的 D7 位必须为高电平,才能让寄存器的其余部分生效。

  2. 如果 EA = 1,中断将启用,且如果 IE 中它们对应的位为高电平,则会对其做出响应。如果 EA = 0,则不会响应任何中断,即使 IE 寄存器中它们对应的引脚为高电平。

Interrupt Priority in 8051

我们可以通过向任何一个中断分配更高优先级来更改中断优先级。这由对名为 IP (中断优先级) 的寄存器进行编程来完成。

下图显示了 IP 寄存器的位。在复位后,IP 寄存器包含所有 0。要向任何一个中断提供更高的优先级,我们会让 IP 寄存器中对应的位变为高电平。

-

-

-

-

PT1

PX1

PT0

PX0

-

IP.7

Not Implemented.

-

IP.6

Not Implemented.

-

IP.5

Not Implemented.

-

IP.4

Not Implemented.

PT1

IP.3

定义定时器 1 中断优先级。

PX1

IP.2

定义外部中断 1 优先级。

PT0

IP.1

定义定时器 0 中断优先级。

PX0

IP.0

定义外部中断 0 优先级。

Interrupt inside Interrupt

如果 8051 正在执行属于中断的 ISR,而另一个中断变得活跃,会发生什么?在这种情况下,高优先级中断可以中断低优先级中断。这称为 interrupt inside interrupt 。在 8051 中,低优先级中断可以被高优先级中断中断,但不能被任何另一个低优先级中断中断。

Triggering an Interrupt by Software

有时我们需要通过模拟的方式测试 ISR。这可以使用向中断设置高电平的简单指令来完成,从而导致 8051 跳至中断向量表。例如,为定时器 1 将 IE 位设置为 1。指令 SETB TF1 会中断 8051 正在进行的任何操作,并强制它跳至中断向量表。