在Arduino草图中,有没有办法在循环内进行异步函数调用?就像通过http服务器监听请求并以非阻塞方式处理它们一样。
在Arduino草图中,有没有办法在循环内进行异步函数调用?就像通过http服务器监听请求并以非阻塞方式处理它们一样。
Answers:
是的,没有。您对要执行的操作有点含糊。我将其分为几个不同的部分(主要集中于读取传感器数据...它适用于所有内容,但这是我正在使用的上下文):
AFAIK所有的Arduino都只有一个内核(它们可以一次完成一件事情)。对于大多数Arduino板,不支持硬件多线程。但是,有一些方法可以实现软件多线程。AsheeshR的方法不适用于需要很长时间才能完成的功能(例如,库中的内容需要一段时间或延迟),因为它们会被这些指令阻塞,但短时间内会很好地起作用功能类似pinMode()
。那里列出的Protothreads库在此方面可能会更好,但是我真的不知道。
使用HTTP很难做到这一点,尤其是因为您必须
草图失速的常见方法是使用延迟。这可以通过在主循环中使用if语句和millis()
返回时间(不是时钟时间,而是自Arduino启动以来的时间)的函数来解决。您也可以在循环内执行循环以轮询传感器数据。
该millis()
方法不适用于导致整个程序停止运行的事情(即,持续较长时间的更多延迟或循环)。请注意,通常100ms IIRC是使UI看起来不太滞后的最长时间。
中断是保持事物几乎异步的好方法。每当引脚状态更改时,它们就会运行一小段代码(由您指定)。它从中断loop()
,并在“ ISR ”运行后返回到上次中断的位置。我没有太多时间来解释如何执行此操作,但是快速的Google搜索将产生很多结果。
就您的示例而言,线程部分将是最适用的。这个主题含糊不清,因此您必须尝试一些事情并找到可行的方法。
前几天,我刚刚在操场上发布了一些任务调度程序的代码,您可能想看看一眼,也许您可以根据需要进行调整。
Arduino的处理器本质上是单线程的,不能执行多任务。正如已经提到的,但是存在创建多任务错觉的方法。Annonomus Penguin的表现不错。
还要检查TimerOne(可能更好;)