技术热线: 4007-888-234

单片机的中断:MCU如何处理中断?

更新时间: 2021-08-26
阅读量:8040

在本文中,将讨论定时器中断的概念,事实上中断是有效使用MCU的最基本方法之一。现在用一个类比来说明事情如何在没有中断的情况下工作:如果你正在煮鸡蛋,并且想在10分钟内将它们从炉子上取下来,那么一种方法是不时检查时钟以确保看看时间是否到了。在嵌入式系统中也是如此:如果你想在执行某些操作之前等待特定状态发生变化,那么一种方法是定期检查状态。或者,如果你的程序正在等待GPIO输入电平;要在执行某个步骤之前从0更改为1,那么一种方法是定期检查GPIO值。这种定期检查的方法称为轮询。

虽然轮询是一种检查状态变化的简单方法,但它是有代价的。如果检查间隔太长,发生和检测之间可能会有很长的滞后——如果在检查之前状态又变回,你可能会完全错过更改。更短的间隔将获得更快、更可靠的检测,但也会消耗更多的处理时间和功率,因为更多的检查将返回否定。

另一种方法是利用中断。使用这种方法,状态变化会产生一个中断信号,使CPU暂停其当前操作(并保存其当前状态),然后执行与中断相关的处理,然后恢复其先前的状态并从中断处恢复。(见图1)

fig1-interrupts-vs-polling-en.jpg

让我们回到煮鸡蛋的例子。我们不会定期检查,而是将计时器设置为10分钟,然后做其他事情直到计时器响起,将我们的注意力转回到鸡蛋上。在这种情况下,定时器作为中断工作,“把鸡蛋从锅里拿出来”是相关的处理。

MCU如何处理中断?

中断可以来自MCU内部和MCU外部设备。例如,来自外部开关或传感器的中断有时称为“附加中断”,因为它是由附加到MCU上的IRQ(中断请求)引脚的外部设备产生的。当相关状态发生变化时,外部设备向该引脚发送中断请求信号,进而产生通知给MCU的中断控制器(在RX63N上,该控制器称为“ICUb”)。

相比之下,来自片上外设(内部定时器、GPIO线、UART等)的中断称为“外设中断”。这些中断信号直接通知中断控制器,无需引脚连接。

中断控制器的工作就是将这些中断请求以协调的方式传递给CPU。当发生多个中断时,控制器必须根据它们的相对优先级以适当的顺序将它们发送到CPU。并且控制器还必须知道哪些中断当前被屏蔽(禁用),以便它可以完全忽略这些中断。

当CPU收到控制器的中断请求时,它停止执行它正在处理的程序,并自动保存所有相关的工作信息,以便以后可以从中断的地方继续执行。然后加载并执行与接收到的中断请求对应的中断处理程序。完成这个处理后,CPU恢复保存的信息并从它停止的地方恢复。(见图2)注意保存和恢复是由CPU自动处理的;程序员不需要关心这些细节。

fig2-interrupt-processing-flow-en.jpg

考虑通过UART进行串行通信的情况。定期监视UART以了解新字符的到来是低效的。因此,在大多数情况下,系统设计为当新字符到达时UART本身会产生中断,提醒CPU执行适当的处理。

类似地,内部定时器通常被设置为驱动中断以某个特定间隔重复执行某个特定进程:每次间隔过去时,定时器都会生成一个中断,告诉CPU运行该进程。一般来说,使用这些类型的中断可以大大提高MCU的运行效率。