En un boceto de Arduino, ¿hay alguna forma de realizar llamadas a funciones asíncronas dentro del bucle? Como escuchar las solicitudes a través del servidor http y procesarlas de forma no bloqueante .
programming
sketch
Jacer Omri
fuente
fuente
Respuestas:
Si y no. Eres un poco vago en lo que quieres hacer. He hecho esto en unas pocas secciones diferentes (enfocadas principalmente en leer los datos del sensor ... se aplica a todo pero ese es el contexto que estoy usando):
Hilos
AFAIK todos los Arduinos solo tienen un núcleo (pueden hacer una cosa a la vez). Para la mayoría de las placas Arduino, el subprocesamiento múltiple de hardware no es compatible. Sin embargo, hay formas de implementar software multihilo . El enfoque de AsheeshR no funcionaría bien para funciones que tardan mucho tiempo en completarse (es decir, algo en una biblioteca que lleva un tiempo o un retraso) porque se atascaría con esas instrucciones, pero funcionaría bien por poco tiempo Las funciones como
pinMode()
. La biblioteca Protothreads listada allí podría ser mejor en esto, pero realmente no lo sé.Sería difícil organizar esto con HTTP, especialmente porque tienes que hacer
Retrasos
Una forma común de detener un boceto es el uso de un retraso. Esto se puede resolver utilizando, en el bucle principal, una instrucción if y la
millis()
función que devuelve una hora (no una hora de reloj, sino la hora desde que comenzó el Arduino). También podría hacer un ciclo dentro del ciclo para sondear los datos del sensor.El
millis()
enfoque no funcionaría bien con cosas que hacen que todo el programa se detenga (es decir, más demoras o bucles que duran una cantidad de tiempo notable). Tenga en cuenta que 100ms IIRC es el tiempo máximo general para hacer que una IU no parezca lenta.Interrupciones
Las interrupciones son una excelente manera de mantener las cosas casi asincrónicas. Ejecutan un código corto (que usted especifica) cada vez que cambia el estado de un pin. Se separa del
loop()
, y vuelve a donde lo dejó una vez que se ha ejecutado el " ISR ". No tengo mucho tiempo para explicar cómo hacer esto, pero una búsqueda rápida en Google arrojará muchos resultados.Según su ejemplo, la sección de subprocesos sería la más aplicable. Este tema es bastante vago, por lo que tendrá que experimentar con algunas cosas y encontrar algo que funcione.
fuente
Acabo de publicar un código para un programador de tareas en el patio de recreo el otro día, es posible que desee echar un vistazo, tal vez pueda adaptarlo a sus necesidades.
El procesador de Arduino es inherentemente de un solo subproceso y no puede realizar varias tareas. Sin embargo, como se mencionó, existen formas de crear la ilusión de la multitarea. Annonomus Penguin los golpeó bastante bien.
También echa un vistazo a TimerOne (probablemente sea mejor;)
fuente