嵌入式系统 - 中断
中断是由硬件或软件向处理器发出的信号,指示需要立即注意的事件。每当中断发生时,控制器就会完成当前指令的执行,并开始执行中断服务程序(ISR)或中断处理程序。ISR 告诉处理器或控制器当中断发生时要做什么。中断可以是硬件中断,也可以是软件中断。
硬件中断
硬件中断是从外部设备(例如磁盘控制器或外部外围设备)发送到处理器的电子警报信号。例如,当我们按下键盘上的按键或移动鼠标时,它们会触发硬件中断,从而导致处理器读取击键或鼠标位置。
软件中断
软件中断是由异常条件或指令集中的特殊指令引起的,该指令在处理器执行时会引起中断。例如,如果处理器的算术逻辑单元运行命令将数字除以零,则会引发被零除异常,从而导致计算机放弃计算或显示错误消息。软件中断指令的工作方式与子程序调用类似。
什么是投票?
连续监视的状态称为轮询。微控制器不断检查其他设备的状态;在此过程中,它不执行任何其他操作,并消耗所有处理时间来进行监视。这个问题可以通过使用中断来解决。
在中断方法中,控制器仅在发生中断时做出响应。因此,控制器不需要定期监视接口和内置设备的状态(标志、信号等)。
中断与轮询
这是一个区分中断和轮询的类比 -
打断 | 轮询 |
---|---|
中断就像店主。如果一个人需要一种服务或产品,他就会去找他并告诉他他的需求。在发生中断的情况下,当接收到标志或信号时,它们会通知控制器它们需要服务。 | 轮询方式就像销售员一样。推销员挨家挨户要求购买产品或服务。类似地,控制器持续一一监控所有设备的标志或信号,并向需要其服务的任何组件提供服务。 |
中断服务程序
对于每个中断,都必须有一个中断服务程序(ISR)或中断处理程序。当中断发生时,微控制器运行中断服务程序。对于每个中断,内存中都有一个固定位置来保存其中断服务例程 ISR 的地址。预留用于保存 ISR 地址的内存位置表称为中断向量表。
中断向量表
8051中有包括RESET在内的6种中断。
中断 | ROM 位置(十六进制) | 别针 |
---|---|---|
中断 | ROM 位置(十六进制) | |
串行 COM(RI 和 TI) | 第0023章 | |
定时器1中断(TF1) | 001B | |
外部硬件中断 1 (INT1) | 0013 | P3.3 (13) |
外部硬件中断 0 (INT0) | 0003 | P3.2 (12) |
定时器0(TF0) | 000B | |
重置 | 0000 | 9 |
当复位引脚被激活时,8051 跳转到地址位置 0000。这是上电复位。
为定时器预留了两个中断:一个用于定时器 0,一个用于定时器 1。中断向量表中的存储位置分别为 000BH 和 001BH。
为硬件外部中断预留了两个中断。引脚号 12 和引脚号。端口3中的13分别用于外部硬件中断INT0和INT1。中断向量表中的内存位置分别为0003H和0013H。
串行通信有一个属于接收和发送的中断。内存位置 0023H 属于该中断。
执行中断的步骤
当中断激活时,微控制器将执行以下步骤 -
微控制器关闭当前正在执行的指令,并将下一条指令(PC)的地址保存在堆栈上。
它还在内部保存所有中断的当前状态(即不在堆栈上)。
它跳转到保存中断服务例程地址的中断向量表的内存位置。
微控制器从中断向量表中获取ISR的地址并跳转到该地址。它开始执行中断服务子程序,即RETI(从中断返回)。
执行 RETI 指令后,微控制器返回到中断的位置。首先,它通过将堆栈的顶部字节弹出到 PC 中来从堆栈中获取程序计数器 (PC) 地址。然后,它从该地址开始执行。
边沿触发与电平触发
中断模块有两种类型:电平触发或边沿触发。
电平触发 | 边沿触发 |
---|---|
每当中断源的电平被置位时,电平触发的中断模块总是生成中断。 | 边沿触发中断模块仅在检测到中断源的有效边沿时才生成中断。当中断源电平实际发生变化时,会检测到边沿。它还可以通过定期采样并在前一个样本被取消断言时检测断言电平来检测。 |
如果固件中断处理程序处理中断时中断源仍然有效,则中断模块将重新生成中断,导致中断处理程序再次被调用。 | 无论中断源的Behave如何,边沿触发的中断模块都可以立即执行。 |
电平触发的中断对于固件来说很麻烦。 | 边沿触发中断可降低固件的代码复杂性,减少固件的条件数量,并在处理中断时提供更大的灵活性。 |
启用和禁用中断
复位后,所有中断即使被激活也被禁用。必须使用软件启用中断,以便微控制器响应这些中断。
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 | 未实现。 |
- | IP.6 | 未实现。 |
- | IP.5 | 未实现。 |
- | IP.4 | 未实现。 |
PT1 | IP.3 | 定义定时器 1 中断优先级。 |
PX1 | IP.2 | 定义外部中断 1 优先级。 |
PT0 | IP.1 | 定义定时器 0 中断优先级。 |
PX0 | IP.0 | 定义外部中断 0 优先级。 |
中断内中断
如果 8051 正在执行一个属于中断的 ISR,而另一个 ISR 被激活,会发生什么情况?在这种情况下,高优先级中断可以中断低优先级中断。这称为中断中的中断。在 8051 中,低优先级中断可以被高优先级中断中断,但不能被任何其他低优先级中断中断。
通过软件触发中断
有时我们需要通过仿真来测试 ISR。这可以通过简单的指令来完成,将中断设置为高电平,从而使 8051 跳转到中断向量表。例如,将定时器 1 的 IE 位设置为 1。SETB TF1指令将中断 8051 正在执行的任何操作,并强制其跳转到中断向量表。