【问题标题】:Polling vs interrupts?轮询与中断?
【发布时间】:2016-06-15 18:14:19
【问题描述】:

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

当中断触发时,设备上的中断寄存器中的一个位被置位并且中断线被置位。

所以我的问题是:轮询中断寄存器以获取数据在功能上与使用中断线有什么不同吗?是否有任何时间问题或我应该注意的任何事情?

【问题讨论】:

    标签: microcontroller interrupt fifo


    【解决方案1】:

    你说的“功能性”不是很清楚。

    轮询中断寄存器的优势在于,您可以确保仅在代码处于处理数据的完美状态时才从 ADC 获取数据。这可以显着简化代码设计。被打断的好处是你不会在没有数据准备好的时候浪费时间去检查寄存器,也不太可能忙着做其他事情而让 FIFO 溢出。

    这两种方法都有意义。

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

    【讨论】:

      【解决方案2】:

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

      实际上创建中断是为了帮助解决轮询问题。无需猜测数据何时准备好,计算机会告诉你,如果你可以设置中断处理程序,则准备执行。

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

        • 我投了反对票,因为虽然它回答了书面的问题,但我不确定这个问题的意图是书面的,我觉得这个答案混淆了问题。大卫施瓦茨的回答我认为更好地处理它。
        【解决方案4】:

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

        当您有了这个 FIFO 后,无论您采用哪种方法,它几乎都是一样的。

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

        【讨论】:

          【解决方案5】:

          比较中断与轮询的基础

          基本 - 设备通知 CPU 它需要 CPU 关注。 CPU 不断检查设备状态是否需要 CPU 的关注。

          机制 - 中断是一种硬件机制。轮询是一种协议。

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

          指示 - 中断请求行指示设备需要服务。命令就绪位表示设备需要维修。

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

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

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

          当 CPU 很少找到准备好服务的设备时,轮询变得低效。

          示例 - 让铃声响起然后打开门检查谁来了。不停地开门看看有没有人来。

          【讨论】:

            猜你喜欢
            • 2012-05-10
            • 1970-01-01
            • 2012-06-11
            • 2013-08-08
            • 1970-01-01
            • 1970-01-01
            • 2016-08-12
            • 2017-01-04
            • 2013-05-20
            相关资源
            最近更新 更多