📜  嵌入式系统-中断

📅  最后修改于: 2021-01-07 05:51:24             🧑  作者: Mango


中断是硬件或软件向处理器发出的信号,指示需要立即注意的事件。每当发生中断时,控制器都会完成当前指令的执行,并开始执行中断服务程序(ISR)或中断处理程序。 ISR告诉处理器或控制器中断发生时该怎么办。中断可以是硬件中断,也可以是软件中断。

硬件中断

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

软件中断

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

什么是轮询?

连续监视的状态称为轮询。微控制器不断检查其他设备的状态。并且这样做时,它不会执行其他任何操作,并且会花费所有的处理时间进行监视。可以通过使用中断来解决此问题。

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

中断与轮询

这是一个区分中断与轮询的类比-

Interrupt Polling
An interrupt is like a shopkeeper. If one needs a service or product, he goes to him and apprises him of his needs. In case of interrupts, when the flags or signals are received, they notify the controller that they need to be serviced. The polling method is like a salesperson. The salesman goes from door to door while requesting to buy a product or service. Similarly, the controller keeps monitoring the flags or signals one by one for all devices and provides service to whichever component that needs its service.

中断服务程序

对于每个中断,必须有一个中断服务程序(ISR)或中断处理程序。发生中断时,微控制器运行中断服务程序。对于每个中断,内存中都有一个固定的位置,用于存放其中断服务程序ISR的地址。保留用于保留ISR地址的存储器位置表称为中断向量表。

执行程序

中断向量表

一共有六个中断,包括8051中的RESET。

Interrupts ROM Location (Hex) Pin
Interrupts ROM Location (HEX)
Serial COM (RI and TI) 0023
Timer 1 interrupts(TF1) 001B
External HW interrupt 1 (INT1) 0013 P3.3 (13)
External HW interrupt 0 (INT0) 0003 P3.2 (12)
Timer 0 (TF0) 000B
Reset 0000 9
  • 激活复位引脚后,8051跳至地址位置0000。这是上电复位。

  • 定时器有两个中断:一个中断给定时器0,一个中断给定时器1。中断向量表中的存储器位置分别为000BH和001BH。

  • 为硬件外部中断预留了两个中断。针号12和Pin号。端口3中的13分别用于外部硬件中断INT0和INT1。中断向量表中的存储器位置分别为0003H和0013H。

  • 串行通信只有一个中断,它既属于接收又属于发送。存储器位置0023H属于此中断。

执行中断的步骤

当中断激活时,微控制器将执行以下步骤:

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

  • 它还在内部保存了所有中断的当前状态(即不在堆栈中)。

  • 它跳转到包含中断服务程序地址的中断向量表的内存位置。

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

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

边沿触发与电平触发

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

Level Triggered Edge Triggered
A level-triggered interrupt module always generates an interrupt whenever the level of the interrupt source is asserted. An edge-triggered interrupt module generates an interrupt only when it detects an asserting edge of the interrupt source. The edge gets detected when the interrupt source level actually changes. It can also be detected by periodic sampling and detecting an asserted level when the previous sample was de-asserted.
If the interrupt source is still asserted when the firmware interrupt handler handles the interrupt, the interrupt module will regenerate the interrupt, causing the interrupt handler to be invoked again. Edge-triggered interrupt modules can be acted immediately, no matter how the interrupt source behaves.
Level-triggered interrupts are cumbersome for firmware. Edge-triggered interrupts keep the firmware’s code complexity low, reduce the number of conditions for firmware, and provide more flexibility when interrupts are handled.

启用和禁用中断

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

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

中断使能寄存器

EA ET2 ES ET1 EX1 ET0 EX0
  • EA-全局启用/禁用。

  • -未定义。

  • ET2-启用定时器2中断。

  • ES-启用串行端口中断。

  • ET1-启用定时器1中断。

  • EX1-启用外部1中断。

  • ET0-启用定时器0中断。

  • EX0-启用外部0中断。

要启用中断,我们采取以下步骤-

  • IE寄存器(EA)的D7位必须为高,才能使其余寄存器生效。

  • 如果EA = 1,如果IE中的相应位为高,则将启用中断并对其做出响应。如果EA = 0,即使IE寄存器中的相关引脚为高电平,也不会响应中断。

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 Defines the Timer 1 interrupt priority level.
PX1 IP.2 Defines the External Interrupt 1 priority level.
PT0 IP.1 Defines the Timer 0 interrupt priority level.
PX0 IP.0 Defines the External Interrupt 0 priority level.

中断内部

如果8051正在执行属于中断的ISR,而另一个中断被激活,会发生什么情况?在这种情况下,高优先级中断可以中断低优先级中断。这被称为中断内部中断。在8051中,可以通过高优先级中断来中断低优先级中断,但是不能通过其他任何低优先级中断来中断。

通过软件触发中断

有时我们需要通过仿真来测试ISR。这可以通过简单的指令来设置,以将中断设置为高电平,从而使8051跳转到中断向量表。例如,将定时器1的IE位置1。一条指令SETB TF1将以任何方式中断8051,并强制其跳至中断向量表。