在没有时间的情况下多任务是不是不好的做法

2021-02-19 11:55

同时处理一些资源,例如一些事情,在这里有一些非常感谢的帮助,我终于掌握了如何对微进行多任务处理。大多数示例使用millis()方法进行非阻塞编程。然而,即使

解答动态

  • };

    • 与通常情况一样,答案是:这取决于。
      通常是非阻塞编程,当您在每个循环上只做很短的事情时。什么是短的取决于具体情况,也就是说,你还想做什么。例如:你在每个环路上读取一个模拟值。analogRead()大约需要100us(参考)。我假设,你的传感器值是相当慢的(所以信号超过150的时间会相当长)。同时,您正在使用digitalRead()读取一个按钮。读取大约需要3.6us(参考)。因此,总的来说,您有一个-150us的循环(包括开销和loop()迭代)。但是你想要捕捉的事件-按下按钮-将在100毫秒的范围内,这是一个比你的循环()的总时间大667倍的因子(当没有事件发生时)。因此,对于最短的事件(按下按钮),所有读取都可以被认为是非阻塞的。(尽管您仍然可以通过if语句中的代码进行阻塞。这是你调查)
      假设,你没有一个按钮,但一个数字信号,你想感测脉冲下降到80us。那么你的analogRead()将花费太长时间,你可能会错过一个脉冲事件。在这种情况下,analogRead()可能被认为是阻塞的。因此,要检查您是否真的在使用非阻塞代码,您需要扪心自问:我是否给了每个代码部分足够的时间来正确执行并捕获所有预期的事件?如果是,那么您是非阻塞的。如果不是,那么您就是blocking.
      作为一个旁注:通常轮询被描述为不好的,但它实际上取决于具体情况。在您的例子中,您按顺序轮询输入,因此每个输入都以loop()运行的相同(总)速率轮询。你什么也不做,为什么不使用轮询来降低处理时间呢?节省的时间在微上使用得再好不过了(与PC不同,在PC上,节省的CPU时间可以分配给不同的程序)。

      • 如果电池电量不足,则应考虑让微尽可能多地睡眠,不要过多地轮询传感器。另外,Arduino core库没有提供管理睡眠的工具,但是一些第三方库可用于此目的。
        如果您的项目使用主电源,则没有必要增加睡眠管理的复杂性。除非你的传感器真的很慢,否则在每个循环迭代中轮询它们通常是好的。具体来说,对于一个按钮,Bounce2库的文档说明应该在每次循环迭代时调用button update方法。

        • End

        免责声明:

        本页内容仅代表作者本人意见,若因此产生任何纠纷由作者本人负责,概与琴岛网公司无关。本页内容仅供参考,请您根据自身实际情况谨慎操作。尤其涉及您或第三方利益等事项,请咨询专业人士处理。