轮询与中断?

时间:2016-03-02 18:09:44

标签: microcontroller interrupt fifo

假设您有一个具有32深度FIFO的设备,其中转换完成后存储来自ADC的数据。每次FIFO中有X个样本时,您都可以触发中断,然后从中获取数据。

当中断触发时,器件中的中断寄存器中的某个位置1,并且中断线被置位。

所以我的问题是:轮询中断寄存器是否使用中断线从功能上获取数据?是否有任何计时问题或我应该注意的任何问题?

5 个答案:

答案 0 :(得分:4)

在功能上"它并不是很明确你的意思。

轮询中断寄存器的优点是,当代码处于完美状态时,您可以确保只从ADC获取数据来处理它。这可以显着简化代码设计。被中断的好处是,当没有数据准备就绪时你不会浪费时间检查寄存器,并且你不太可能忙于做其他事情并让FIFO溢出。

这两种方法都有意义。

通常,您将使用中断处理程序将结果复制到更大的软件FIFO中并轮询软件FIFO。这可确保如果高级代码忙碌的时间超过填充FIFO所需的时间,则数据不会丢失。但是,如果您的代码足够简单以至于不是问题,那么这种额外的复杂性并不会给您带来太大的影响。

答案 1 :(得分:0)

轮询意味着您不知道数据何时准备就绪,但您可以在准备就绪时获取数据。您必须告诉您的程序如何等待数据。同时,中断在数据就绪时立即触发,中断处理程序可以在下一条指令完成之前获取数据。

实际创建了中断以帮助解决轮询问题。无需猜测数据何时就绪,计算机将告诉您,如果您可以设置中断处理程序,请准备执行。

答案 2 :(得分:0)

它们在功能上是相同的。中断使您在等待时更容易做其他事情,但您也可以在等待和轮询时做其他事情。 "它取决于"但是任何一个都可能更具确定性,取决于指令集,处理器以及你在等待时还在做什么。

没有正确的答案,如果逻辑设计为允许两者平等地工作,每个都有其优点和缺点,则两者都有效。轮询通常意味着您没有做任何其他事情或有足够的时间。另一方面,轮询这可能是你在前台做的事情,也可能是后台其他事情的中断。

有成功的实时或嵌入式或确定性设计是基于轮询的和基于中断的设计。在这两种情况下,您都必须进行系统工程并了解为每种情况执行最佳和最差情况所需的所有任务,这些任务对于各种事物具有更高的优先级(您可能有多个因不同原因而非常重要的事情并且必须管理那个)。基于轮询的设计,您必须走完所有路径,并确保所有路径都满足设计中所有要求。对于中断,相同的交易只是路径更难以看到。

答案 3 :(得分:0)

首先,我建议您始终使用自己的FIFO缓冲区,并在端口中断内填充,或者在定时器中断内部轮询时。由于FIFO可以很容易地实现为无锁线程安全集合(假定一个编写器,一个读取器),因此它没有用。

当你有这个FIFO时,你采取的方法几乎相同。

话虽如此,如果您选择基于计时器的轮询,请确保计算清除缓冲区所需的速度;即32字节的硬件FIFO将以115200的波特率填充~2.8ms,因此在这种情况下,您可能需要至少1ms的定时器来读取队列中的任何内容。

答案 4 :(得分:0)

比较中断与投票的基础

Basic - 设备通知CPU它需要CPU注意。 CPU会不断检查设备状态是否需要CPU注意。

机制 - 中断是一种硬件机制。轮询是一项议定书。

服务 - 中断处理程序为设备提供服务。 CPU为设备提供服务。

指示 - 中断请求行表示设备需要维修。 Comand-ready位表示设备需要维修。

CPU -CPU仅在设备需要维修时受到干扰,这样可以节省CPU周期。 CPU必须等待并检查设备是否需要维护,这会浪费大量的CPU周期。

发生 - 任何时候都可能发生中断。 CPU定期轮询设备。

效率 - 当设备不断重复中断CPU时,中断变得低效。

当CPU很少发现设备准备好服务时,轮询效率会降低。

示例 - 让铃声然后打开门检查谁来了。不断打开门,检查是否有人来。