Embedded Systems 简明教程
Embedded Systems - Interrupts
中断是由硬件或软件发出的信号,指示需要立即注意的事件。每当中断发生时,控制器都会完成执行当前指令,并开始执行一个 Interrupt Service Routine (ISR) 或 Interrupt Handler 。ISR 会告诉处理器或控制器在中断发生时做什么。中断可以是硬件中断或软件中断。
Hardware Interrupt
硬件中断是从外部设备(如磁盘控制器或外部外围设备)发送到处理器的电子警报信号。例如,当我们在键盘上按一个键或移动鼠标时,它们会触发硬件中断,导致处理器读取击键或鼠标位置。
Software Interrupt
软件中断是由特殊情况或指令集中的特殊指令引起的,当它们被处理器执行时会引起中断。例如,如果处理器的算术逻辑单元运行一个将数字除以零的命令,从而导致除以零异常,从而导致计算机放弃计算或显示错误消息。软件中断指令的工作方式类似于子例程调用。
What is Polling?
持续监视的状态被称为 polling 。微控制器持续检查其他设备的状态;在执行此操作时,它不执行任何其他操作,并消耗所有处理时间来进行监视。可以通过使用中断来解决此问题。
在中断方法中,控制器仅在发生中断时响应。因此,不需要控制器定期监视接口和内置设备的状态(标志、信号等)。
Interrupt Service Routine
对于每个中断,都必须有一个中断服务例程 (ISR) 或 interrupt handler 。当发生中断时,微控制器会运行中断服务例程。对于每个中断,内存中都有一个固定位置,用于保存其中断服务例程 ISR 的地址。为保存 ISR 地址而留出的内存位置表称为中断向量表。
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 |
-
当复位引脚被激活时,8051 跳转到地址位置 0000。这是上电复位。
-
为定时器设置了两个中断:一个用于定时器 0,另一个用于定时器 1。在中断向量表中,内存位置分别为 000BH 和 001BH。
-
为硬件外部中断设置了两个中断。端口 3 中的引脚编号 12 和引脚编号 13 分别用于外部硬件中断 INT0 和 INT1。在中断向量表中,内存位置分别为 0003H 和 0013H。
-
串行通信有一个中断,它属于接收和发送。内存位置 0023H 属于此中断。
Steps to Execute an Interrupt
当一个中断变得活跃时,微控制器将经历以下步骤 −
-
微控制器关闭当前执行的指令,并将下一条指令(PC)的地址保存在堆栈中。
-
它还内部保存了所有中断的当前状态(即,不在堆叠中)。
-
它跳转到中断向量表中的内存位置,其中保存了中断服务例程的地址。
-
微控制器从中断向量表获取 ISR 的地址并跳转到它。它开始执行中断服务子例程,该子例程是 RETI(从中断返回)。
-
在执行 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 |
-
EA − Global enable/disable.
-
- − Undefined.
-
ET2 − 启用定时器 2 中断。
-
ES − 启用串口中断。
-
ET1 − 启用定时器 1 中断。
-
EX1 − 启用外部 1 中断。
-
ET0 − 启用定时器 0 中断。
-
EX0 − 启用外部 0 中断。
要启用中断,我们会执行以下步骤 −
-
IE 寄存器 (EA) 的 D7 位必须为高电平,才能让寄存器的其余部分生效。
-
如果 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 优先级。 |