轮询与中断?
Polling vs interrupts?
假设您有一个具有 32 深度 FIFO 的设备,其中在转换完成后存储来自 ADC 的数据。每当 FIFO 中有 X 个样本时,您都可以触发中断并从中获取数据。
当中断触发时,设备中断寄存器中的一个位被置位,中断线被断言。
所以我的问题是:轮询中断寄存器以获取数据与使用中断线在功能上有什么不同吗?是否有任何时间问题或我应该注意的事项?
你所说的 "functionally" 不是很清楚。
轮询中断寄存器的优势在于,您可以确保仅在代码处于处理数据的最佳状态时才从 ADC 获取数据。这可以大大简化代码设计。被打断的好处是当没有数据准备好时,您不会浪费时间检查寄存器,而且您不太可能忙于做其他事情而让 FIFO 溢出。
两种方法都有意义。
通常,您会使用中断处理程序将结果复制到更大的软件 FIFO 并轮询软件 FIFO。如果您的高级代码忙碌的时间超过填充 FIFO 所需的时间,这可确保数据不会丢失。但是,如果您的代码足够简单,这不是问题,那么这种额外的复杂性不会给您带来太多好处。
轮询意味着您不会知道数据何时准备好,但是您可以在准备好时获取它。你必须告诉你的程序如何等待数据。同时,当数据就绪时立即触发中断,中断处理程序可以在下一条指令完成之前获取数据。
实际上创建中断是为了帮助解决轮询问题。不用猜数据什么时候准备好,电脑会告诉你和,如果你能设置中断处理程序,准备执行。
它们在功能上是相同的。中断使您在等待时更容易做其他事情,但您也可以在等待和轮询时做其他事情。 "It depends" 但其中任何一个都可能更具确定性,具体取决于指令集、处理器以及您在等待时所做的其他事情。
没有正确的答案,如果逻辑设计为允许两者同等工作,则两者通常都可以工作,每个都有其优点和缺点。轮询通常意味着您没有做任何其他事情或没有足够的时间。另一方面,轮询这可能是您在前台所做的事情,并会在后台中断其他事情。
有并且可以有成功的基于轮询和基于中断的实时或嵌入式或确定性设计。在这两种情况下,您都必须进行系统工程并了解为每种情况做最好和最坏情况所需的所有任务,这对各种事情都有更高的优先级(由于不同的原因,您可能有不止一件非常重要的事情并且必须管理它)。基于轮询的设计,您必须遍历所有路径并确保所有路径都满足设计中所有内容的要求。对于中断相同的交易,只是路径更难看到。
首先,我建议您始终使用自己的 FIFO 缓冲区,并将其填充到端口中断中,或者在定时器中断中进行轮询。由于 FIFO 可以很容易地实现为无锁线程安全集合(假设一个编写器,一个 reader),这很简单。
当你有这个 FIFO 时,无论你采用哪种方法,它几乎都是一样的。
话虽如此,如果您确实选择基于计时器的轮询,请确保您计算清空缓冲区所需的速度;也就是说,一个 32 字节的硬件 FIFO 将在 115200 波特率下填充约 2.8 毫秒,因此在这种情况下,您可能至少需要一个 1 毫秒的计时器来读取队列中的任何内容。
比较中断与轮询的基础
基本 - 设备通知 CPU 它需要 CPU 注意。 CPU 不断检查设备状态是否需要 CPU 的关注。
机制-中断是一种硬件机制。轮询是一种协议。
服务 - 中断处理程序为设备服务。 CPU 服务设备。
指示-中断请求行指示设备需要维修。命令就绪位表示设备需要维修。
CPU -CPU 仅在设备需要维修时才会受到干扰,这样可以节省 CPU 个周期。 CPU 必须等待并检查设备是否需要维修,这会浪费大量 CPU 个周期。
发生 - 中断随时可能发生。 CPU 定期轮询设备。
效率 - 当设备不断中断 CPU 时,中断变得低效。
当 CPU 很少能找到准备好服务的设备时,轮询变得低效。
例子-让铃响然后开门看看谁来了。不停的开门看看有没有人来
假设您有一个具有 32 深度 FIFO 的设备,其中在转换完成后存储来自 ADC 的数据。每当 FIFO 中有 X 个样本时,您都可以触发中断并从中获取数据。
当中断触发时,设备中断寄存器中的一个位被置位,中断线被断言。
所以我的问题是:轮询中断寄存器以获取数据与使用中断线在功能上有什么不同吗?是否有任何时间问题或我应该注意的事项?
你所说的 "functionally" 不是很清楚。
轮询中断寄存器的优势在于,您可以确保仅在代码处于处理数据的最佳状态时才从 ADC 获取数据。这可以大大简化代码设计。被打断的好处是当没有数据准备好时,您不会浪费时间检查寄存器,而且您不太可能忙于做其他事情而让 FIFO 溢出。
两种方法都有意义。
通常,您会使用中断处理程序将结果复制到更大的软件 FIFO 并轮询软件 FIFO。如果您的高级代码忙碌的时间超过填充 FIFO 所需的时间,这可确保数据不会丢失。但是,如果您的代码足够简单,这不是问题,那么这种额外的复杂性不会给您带来太多好处。
轮询意味着您不会知道数据何时准备好,但是您可以在准备好时获取它。你必须告诉你的程序如何等待数据。同时,当数据就绪时立即触发中断,中断处理程序可以在下一条指令完成之前获取数据。
实际上创建中断是为了帮助解决轮询问题。不用猜数据什么时候准备好,电脑会告诉你和,如果你能设置中断处理程序,准备执行。
它们在功能上是相同的。中断使您在等待时更容易做其他事情,但您也可以在等待和轮询时做其他事情。 "It depends" 但其中任何一个都可能更具确定性,具体取决于指令集、处理器以及您在等待时所做的其他事情。
没有正确的答案,如果逻辑设计为允许两者同等工作,则两者通常都可以工作,每个都有其优点和缺点。轮询通常意味着您没有做任何其他事情或没有足够的时间。另一方面,轮询这可能是您在前台所做的事情,并会在后台中断其他事情。
有并且可以有成功的基于轮询和基于中断的实时或嵌入式或确定性设计。在这两种情况下,您都必须进行系统工程并了解为每种情况做最好和最坏情况所需的所有任务,这对各种事情都有更高的优先级(由于不同的原因,您可能有不止一件非常重要的事情并且必须管理它)。基于轮询的设计,您必须遍历所有路径并确保所有路径都满足设计中所有内容的要求。对于中断相同的交易,只是路径更难看到。
首先,我建议您始终使用自己的 FIFO 缓冲区,并将其填充到端口中断中,或者在定时器中断中进行轮询。由于 FIFO 可以很容易地实现为无锁线程安全集合(假设一个编写器,一个 reader),这很简单。
当你有这个 FIFO 时,无论你采用哪种方法,它几乎都是一样的。
话虽如此,如果您确实选择基于计时器的轮询,请确保您计算清空缓冲区所需的速度;也就是说,一个 32 字节的硬件 FIFO 将在 115200 波特率下填充约 2.8 毫秒,因此在这种情况下,您可能至少需要一个 1 毫秒的计时器来读取队列中的任何内容。
比较中断与轮询的基础
基本 - 设备通知 CPU 它需要 CPU 注意。 CPU 不断检查设备状态是否需要 CPU 的关注。
机制-中断是一种硬件机制。轮询是一种协议。
服务 - 中断处理程序为设备服务。 CPU 服务设备。
指示-中断请求行指示设备需要维修。命令就绪位表示设备需要维修。
CPU -CPU 仅在设备需要维修时才会受到干扰,这样可以节省 CPU 个周期。 CPU 必须等待并检查设备是否需要维修,这会浪费大量 CPU 个周期。
发生 - 中断随时可能发生。 CPU 定期轮询设备。
效率 - 当设备不断中断 CPU 时,中断变得低效。
当 CPU 很少能找到准备好服务的设备时,轮询变得低效。
例子-让铃响然后开门看看谁来了。不停的开门看看有没有人来