(资料图)
在本文中,将讨论定时器中断的概念,事实上中断是有效使用MCU的最基本方法之一。现在用一个类比来说明事情如何在没有中断的情况下工作:如果你正在煮鸡蛋,并且想在10分钟内将它们从炉子上取下来,那么一种方法是不时检查时钟以确保看看时间是否到了。在嵌入式系统中也是如此:如果你想在执行某些操作之前等待特定状态发生变化,那么一种方法是定期检查状态。或者,如果你的程序正在等待GPIO输入电平;要在执行某个步骤之前从0更改为1,那么一种方法是定期检查GPIO值。这种定期检查的方法称为轮询。
虽然轮询是一种检查状态变化的简单方法,但它是有代价的。如果检查间隔太长,发生和检测之间可能会有很长的滞后——如果在检查之前状态又变回,你可能会完全错过更改。更短的间隔将获得更快、更可靠的检测,但也会消耗更多的处理时间和功率,因为更多的检查将返回否定。
另一种方法是利用中断。使用这种方法,状态变化会产生一个中断信号,使CPU暂停其当前操作(并保存其当前状态),然后执行与中断相关的处理,然后恢复其先前的状态并从中断处恢复。(见图1)
让我们回到煮鸡蛋的例子。我们不会定期检查,而是将计时器设置为10分钟,然后做其他事情直到计时器响起,将我们的注意力转回到鸡蛋上。在这种情况下,定时器作为中断工作,“把鸡蛋从锅里拿出来”是相关的处理。
MCU如何处理中断?
中断可以来自MCU内部和MCU外部设备。例如,来自外部开关或传感器的中断有时称为“附加中断”,因为它是由附加到MCU上的IRQ(中断请求)引脚的外部设备产生的。当相关状态发生变化时,外部设备向该引脚发送中断请求信号,进而产生通知给MCU的中断控制器(在RX63N上,该控制器称为“ICUb”)。
相比之下,来自片上外设(内部定时器、GPIO线、UART等)的中断称为“外设中断”。这些中断信号直接通知中断控制器,无需引脚连接。
中断控制器的工作就是将这些中断请求以协调的方式传递给CPU。当发生多个中断时,控制器必须根据它们的相对优先级以适当的顺序将它们发送到CPU。并且控制器还必须知道哪些中断当前被屏蔽(禁用),以便它可以完全忽略这些中断。
当CPU收到控制器的中断请求时,它停止执行它正在处理的程序,并自动保存所有相关的工作信息,以便以后可以从中断的地方继续执行。然后加载并执行与接收到的中断请求对应的中断处理程序。完成这个处理后,CPU恢复保存的信息并从它停止的地方恢复。(见图2)注意保存和恢复是由CPU自动处理的;程序员不需要关心这些细节。
考虑通过UART进行串行通信的情况。定期监视UART以了解新字符的到来是低效的。因此,在大多数情况下,系统设计为当新字符到达时UART本身会产生中断,提醒CPU执行适当的处理。
Copyright @ 2015-2022 中国新科技版权所有 备案号: 沪ICP备2022005074号-4 联系邮箱:58 55 97 3@qq.com