现代数字电子技术实现的许多功能都依赖于这样一个事实,即普通处理器每秒可以执行数百万或数十亿次操作。这种令人眼花fast乱的速度似乎使设备似乎正在一次处理许多操作,而实际上,它正在迅速遵循一组顺序的指令,通常具有多次重复。因此,从我们在这样的时间尺度上对事件的感知来看,它与瞬时是无法区分的。
当今的计算机和智能手机处理器还利用多个处理核心来进一步提高计算性能。但是,有许多应用程序依赖于速度较慢,价格较低的单处理核心微控制器(MCU)。对于单核MCU,仅处理速度可能无法提供足够水平的响应能力。在这种情况下,最终用户可能会觉得设备呆滞。例如,在按下按钮和输出LED响应之间可能会有很大的时间间隔,从而导致用户体验不佳。

应对这种看似缓慢的响应的一种方法是尽可能频繁地轮询(检查)输入。但是,与检查按钮的次数相比,例如检查相对不频繁更改状态的I / O引脚的状态,很可能会浪费许多时钟周期。此外,如果检查按钮状态的代码处于仅在按下按钮后才会中断的软件循环中,那么微控制器将不执行任何操作,仅在此之前检查按钮!轮询虽然易于实现,但在只有一个单核处理器且要完成多个任务的情况下,它是一个较差的解决方案。大多数微控制器(包括成本较低的微控制器)通常会实现 打断 。顾名思义,中断响应某些事件而暂时中止了代码主循环的正常操作。根据MCU的不同,有多种使用中断的功能,包括内部计数器,配有特殊硬件的外部I / O引脚,板载模数转换器,EEPROM和通信端口。除了源于硬件的中断外,某些MCU还提供基于软件的中断。软件中断也可以执行许多功能,例如,它们可以用于监视内部寄存器并在发生某些事件时触发中断,例如算术逻辑单元试图将其除以零或计算导致溢出。
通常,当触发中断时,微控制器将完成当前指令的执行。 (有一些特殊的中断能够立即处理关键任务。)在中断期间,寄存器和程序计数器的当前状态必须存储在称为堆栈的特殊存储区中。通过将程序执行的当前状态压入堆栈,可以在中断处理后使MCU恢复正常的程序执行。堆栈的行为(后进先出数据结构)允许按顺序处理嵌套(多个)中断。一些微控制器允许相对于彼此在某种程度上对中断进行优先级排序,但是,有时最好在服务第一个中断的同时简单地禁用中断以允许受控行为。
中断背后有一种组织力量,称为MCU使用的中断向量表。一旦将微控制器寄存器的当前状态存储在堆栈中,中断向量表就会指示接下来要执行的指令。中断向量表是一个查找表(类似于地址簿),其中包含每个中断服务程序(ISR)开头的内存地址。 ISR只是一个特殊功能,仅在触发特定中断时才调用它。根据触发的中断,可以调用不同的ISR。例如,如果 内部 如果定时器中断被触发,并且具有完全不同的行为 外部 I / O引脚中断被触发。在这两种情况下,设备的表观响应性似乎都比仅依赖轮询方法的情况要快得多。
关于ISR的进一步说明:您应该特别小心,以仅使用完成所需中断绝对必要的中断来最小化中断服务程序中的代码量。例如,从中断服务程序内部打印调试消息不是一个好主意。一旦中断服务程序完成执行,就可以通过将先前存储的寄存器数据从堆栈中弹出并将程序计数器重置为没有调用中断时的值来恢复正常操作。
发表评论