嵌入式系统 - 中断

  • 简述

    中断是由硬件或软件向处理器发出的信号,指示需要立即注意的事件。每当中断发生时,控制器完成当前指令的执行并开始执行一个中断服务例程 (ISR) 或 中断处理程序. ISR 告诉处理器或控制器在中断发生时要做什么。中断可以是硬件中断或软件中断。
  • 硬件中断

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

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

    持续监控的状态称为 polling. 微控制器不断检查其他设备的状态;并且在这样做的同时,它不做任何其他操作,并消耗其所有处理时间进行监控。这个问题可以通过使用中断来解决。
    在中断方法中,控制器仅在发生中断时响应。因此,控制器不需要定期监控接口和内置设备的状态(标志、信号等)。

    中断与轮询

    这是一个将中断与轮询区分开来的类比 -
    中断 轮询
    中断就像 shopkeeper. 如果一个人需要一种服务或产品,他就会去找他并告知他他的需求。在中断的情况下,当接收到标志或信号时,它们通知控制器它们需要被服务。 轮询方法就像一个 salesperson. 推销员在要求购买产品或服务时挨家挨户挨家挨户。类似地,控制器持续监控所有设备的标志或信号,并向需要其服务的任何组件提供服务。
  • 中断服务程序

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

    8051中有包括RESET在内的6个中断。
    中断 ROM 位置(十六进制) Pin
    中断 ROM 位置 (HEX)
    串行 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) 地址。然后,它开始从该地址执行。
  • 边沿触发与电平触发

    中断模块有两种类型 - 电平触发或边沿触发。
    电平触发 边沿触发
    每当中断源的电平被置位时,电平触发的中断模块总是会产生一个中断。 边沿触发中断模块仅在检测到中断源的断言边沿时才会产生中断。当中断源级别实际发生变化时,就会检测到边沿。也可以通过定期采样和在前一个样本被取消断言时检测断言电平来检测。
    如果固件中断处理程序处理中断时中断源仍然有效,则中断模块将重新生成中断,导致再次调用中断处理程序。 无论中断源的行为如何,边沿触发的中断模块都可以立即执行。
    电平触发的中断对于固件来说很麻烦。 边沿触发中断使固件的代码复杂度保持在较低水平,减少了固件条件的数量,并在处理中断时提供了更大的灵活性。
  • 启用和禁用中断

    复位时,所有中断即使被激活也被禁用。必须使用软件启用中断,以便微控制器响应这些中断。
    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 而另一个被激活,会发生什么?在这种情况下,高优先级中断可以中断低优先级中断。这被称为interrupt inside interrupt. 在 8051 中,低优先级中断可以被高优先级中断中断,但不能被任何其他低优先级中断中断。
  • 通过软件触发中断

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