欢迎回到Digilent博客!
对于那些已经编写了一段时间代码的人来说,您可能听说过中断和轮询。这两种技术都可以用来提醒系统板,如chipKIT微控制器,当一个输入已经发生。但是这两种方法有什么区别呢?一个比另一个好吗?让我们找出答案。
当使用chipKIT板时,你可能要做的最早的项目之一是设置一个电路,这样当你按下一个按钮时,LED就会打开。程序知道你是否按下按钮的方式是通过数字读取连接到按钮的引脚的当前电压状态,然后适当地打开或关闭LED。然而,通过数字读取,微控制器必须不断检查引脚上的电压状态,以查看下一步应该采取什么行动(打开或关闭LED)。这种不断检查的方法称为轮询。它可能会消耗大量的处理器,因为微控制器总是检查变化,但它也是一种简单的方法,确保一旦变化发生,你想要的效果就会在变化之后立即发生。
那么中断呢?中断也是一种检测系统中是否发生了更改的方法,但它不需要不断地检查是否发生了什么。更确切地说,一个中断在硬件上改变了一点,并导致一个中断服务程序(ISR)立即发生,即使chipKIT板正在中间做其他事情,比如打印一些东西到串行监视器(因此得名“中断”)。通常,中断服务程序会设置某种标志(一个布尔值)来指示系统板已经发生了一个中断,然后系统板将更充分地处理一旦它专门检查该标志的状态。
但是如果一个中断立即发生,为什么不在中断发生时立即执行与该中断相关的所有内容呢?在所有现实中,答案是你可以让所有的事情发生在ISR中。实际上,大多数应用程序在一定程度上对时间敏感,因此在一个设计为短暂发生的中断中运行大量代码会适得其反。另外,像delay()这样依赖于时间的函数不会在ISR中工作,millis()的计数器也不会在中断中继续滴答作响。正因为如此,为了保持系统板像设计的那样平稳地运行,在main中偶尔运行一次轮询来检查中断标志是否已经改变往往会容易得多。
那么,中断和轮询之间的主要区别是什么?一个类比是,你的手机收到一条短信;如果你一直拿出手机查看是否有人给你发过短信,这就是民意调查。如果你正在忙你的一天,然后突然听到你的手机嗡嗡响(中断),你现在知道你收到了一条短信(设置中断标志),然后可以选择在此时或稍后更方便的时候检查你的手机。
你最常用的方法是什么?

根据我想要实现的目标,我将两者结合使用。
你怎么知道哪个位是通过按下基本I/O屏蔽上的按钮1设置的?