编程中忙等待和定时器中断的优缺点是什么?

4
使用忙等待是实现适当时间延迟的可行方法,但使用忙等待或定时器中断方法编程有哪些优缺点呢?

我不确定什么是“忙等待”。你能在你的问题中发布一个示例代码片段吗? - ryyker
1
忙等待是指在一个循环中等待并不断检查,直到满足某个条件才能继续进行下一个进程的过程。 - M.Khalaf
3个回答

4

可能有很多,我会尝试解释我认为最重要的。

繁忙等待的优点:

  • 执行过程通常更易理解,因此出错率更低。
  • 在某些情况下,可以更准确地确定时间。

缺点:

  • 除了其他中断例程之外,没有其他代码可以执行。
  • CPU时间被浪费:如果没有其他工作需要处理,将一些省电状态设置好并让定时器中断及时唤醒它仍然更有效率。

如果您想要对答案进行澄清,请随时提出。如果您认为这是一个“糟糕”的答案,那么请给出您认为是“好的答案”作为您的答案。如果您想要参与争论和互相指责,请不要在此发表。 - George Stocker
你好,感谢你的回答。不过,你能否提供更多忙等待进程的优点呢? - M.Khalaf

2

在嵌入式设备中,忙等待的一个缺点是增加了功耗。在忙等待期间,处理器一直以全功率运行,消耗电力但没有结果。大多数低功率处理器都有能力在等待定时器中断时将处理器置于休眠状态,从而大大降低功耗。功耗越低 = 电池寿命更长。


2

除非你的应用程序没有其他事情可做,或者结果需要立即处理(这种情况相当罕见),否则你不希望进行忙等待。这会消耗掉本来可以用来做其他事情或睡眠的周期。

一个简单的例子是,假设你正在制作一款通过UART与wifi芯片通信的wifi恒温器。你的应用程序将需要读取和处理温度、在有新数据可用时更新、发送wifi消息、接收wifi消息和接收按钮推送的更新,仅举几个例子。如果你正在忙等待其中任何一个事件发生,那么除非它通过中断,否则你的恒温器无法执行任何其他操作。


决定并不那么简单。使用轮询可能有很好的理由,例如可靠性或固定周期时间。事件驱动方法可能需要相当大的开销才能提供类似的稳定性。但是像往常一样:这取决于情况。 - too honest for this site
你可以轮询某些东西,但那并不一定是忙等待。在我的例子中,你可以随时轮询温度,但你不想坐在一个繁忙的 while 或 for 循环中,直到它被更改或经过一定的时间,也不会通常希望在发送消息后坐等响应。那是浪费的,你还有很多事情可以做。 - Dom
通常情况下,轮询等待标志位的设置。该标志位信号CPU必须要做出反应的事件。这通常被称为忙等待。通常你会有一个大的状态机循环,它轮询某些标志并相应地前进。不一定有一个单独的标志完全阻塞了CPU。GUI应用程序主事件循环可能是一个典型的例子。虽然有更好和更现代的方法。但正如我所写的:这并不是非黑即白的。不冒犯,但你是否曾经编写过嵌入式系统,除了闪烁LED之外? - too honest for this site
@Olaf 是的,我设计过整个系统... 我觉得你并没有真正理解我在说什么。不要忙等待,在等待期间做其他有用的事情,而不是一直阻塞,直到事件解决。 - Dom
我认为有很好的理由使用中央轮询循环和忙等待。你可能只是没有在这个非常有用的领域工作过。如果正确地实现,它不一定会增加适当硬件的功耗。从系统视角来看,实际上每个基于任务的实时操作系统都实现了某种形式的忙等待。这就是空闲任务的作用。(而使用像ARM WFI/WFE这样的特殊指令并不改变语义)。实际上,只有很少的系统在某个层面上不实现某种形式的忙等待。 - too honest for this site

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接