Arduino草图中的异步函数调用


14

在Arduino草图中,有没有办法在循环内进行异步函数调用?就像通过http服务器监听请求并以非阻塞方式处理它们一样。


1
如果您不是C ++初学者,那么可以看一下Cosa库(github.com/mikaelpatel/Cosa)。它是对Arduino库的完整重写,以使其更好:OOP,通常由中断驱动。我认为他们支持HTTP,但是我还没有检查过那部分。
jfpoilpret 2014年

Answers:


11

是的,没有。您对要执行的操作有点含糊。我将其分为几个不同的部分(主要集中于读取传感器数据...它适用于所有内容,但这是我正在使用的上下文):

线程数

AFAIK所有的Arduino都只有一个内核(它们可以一次完成一件事情)。对于大多数Arduino板,不支持硬件多线程。但是,有一些方法可以实现软件多线程。AsheeshR的方法不适用于需要很长时间才能完成的功能(例如,库中的内容需要一段时间或延迟),因为它们会被这些指令阻塞,但短时间内会很好地起作用功能类似pinMode()。那里列出的Protothreads库在此方面可能会更好,但是我真的不知道。

使用HTTP很难做到这一点,尤其是因为您必须

延误

草图失速的常见方法是使用延迟。这可以通过在主循环中使用if语句和millis()返回时间(不是时钟时间,而是自Arduino启动以来的时间)的函数来解决。您也可以在循环内执行循环以轮询传感器数据。

millis()方法不适用于导致整个程序停止运行的事情(即,持续较长时间的更多延迟或循环)。请注意,通常100ms IIRC是使UI看起来不太滞后的最长时间。

中断

中断是保持事物几乎异步的好方法。每当引脚状态更改时,它们就会运行一小段代码(由您指定)。它从中断loop(),并在“ ISR ”运行后返回到上次中断的位置。我没有太多时间来解释如何执行此操作,但是快速的Google搜索将产生很多结果。


就您的示例而言,线程部分将是最适用的。这个主题含糊不清,因此您必须尝试一些事情并找到可行的方法。


3

前几天,我刚刚在操场上发布了一些任务调度程序的代码,您可能想看看一眼,也许您可​​以根据需要进行调整。

Arduino的处理器本质上是单线程的,不能执行多任务。正如已经提到的,但是存在创建多任务错觉的方法。Annonomus Penguin的表现不错。

还要检查TimerOne(可能更好;)


TimerOne是一个坏主意,因为它仅适用于基于avr的arduinos。比如我Wemos D1 R1不起作用
Vyachaslav Gerchicov
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.