Archivo de la etiqueta: tiempo

Multitarea sin bloqueo 2.0

Si algo se puede hacer más fácil… ¿por qué no hacerlo?

En una entrada anterior del blog se explicaba un sencillo sistema para simular un sistema multitarea donde cada tarea se ejecuta en un intervalo de tiempo según su necesidad. El único requisito era no interferir en este sistema de gestión multitarea con bloques del tipo “Esperar” que bloquean el programa Arduino totalmente durante su ejecución o con bucles que se repiten por tiempo indefinido.

Los microprocesadores de un único núcleo como el de Arduino “sólo” saben ejecutar una cosa detrás de otra, son los sistemas operativos los que se encargan de “partir” en trocitos los programas e ir ejecutando un poquito de cada uno para simular la multitarea… pero Arduino no da tanto como para instalarle un sistema operativo por lo que ese trabajo de dividir las tareas la hacemos nosotros.

Entrada anterior del blog respecto a este tema (leer antes si no se ha leído):

Multitarea sin bloqueo

Entender el capítulo anterior es fundamental… pero y si lo podemos simplificar aún más.. ¿por qué no?

Pues con este nuevo bloque de ArduinoBlocks implementamos automáticamente todo el funcionamiento explicado anteriormente.

2016-12-05-18_19_35-arduinoblocks

El código introducido dentro de este bloque se “intentará” ejecutar cada 1000 milisegundos (o los que indiquemos). Y digo “intentará” pues esto dependerá del resto del programa de que no bloquee el funcionamiento y de tiempo a que la tarea se ejecute periódicamente con esta frecuencia.

Si han pasado menos de 1000 ms (o los que se indiquen) desde la última ejecución, el contenido del bloque se ignorará y se continuará con la ejecución pero si no (si han pasado 1000 ms o más, por si alguna otra tarea ha retrasado) se ejecutará y se volverá a empezar a contar el tiempo desde entonces para la próxima ejecución.

Mejor con un ejemplo:

2016-12-05-18_23_26-arduinoblocks

http://arduinoblocks.com/web/project/590

Si añadimos bloques que “bloqueen” el funcionamiento del programa sin dejar avanzar (tipo bloques “Esperar” o un bucle que se quede esperando una condición que no llega) el sistema ya no realizará las tareas en los intervalos correctamente.

Además si alguna tarea tarda más de la cuenta en ejecutarse y pasar a la siguiente retrasará al resto (normalmente las operaciones dentro de las tareas se ejecutan muy rápido y no hay ese problema)

Ejemplo con funciones, dividiendo por prioridad de las tareas:

2016-12-05-18_28_02-arduinoblocks

Tareas críticas:  por ejemplo detectar una pulsación de entrada, leer un sensor, actuar según una condición, leer conexión serie / bluetooth,….

Tareas cada 1s: por ejemplo realizar cálculos con los datos de entrada y otros procesamiento,…

Tareas cada 5s: por ejemplo actualizar una pantalla, enviar información por serie o bluetooth, etc…

 

Y recuerda para dominar ArduinoBlocks ya está disponible el libro oficial en Amazon:

portada_delante_small

Compartir

Multitarea sin bloqueo

Muchas veces queremos realizar diferentes tareas dentro de nuestro programa. El problema de utilizar bloques de “espera” es que bloquean el funcionamiento de todo el programa hasta superar el tiempo de espera indicado.

Aquí muestro como realizar fácilmente un sistema de tareas que permite la ejecución de cada una de ellas cada cierto tiempo. En el ejemplo se realizan 2 tareas cada 3s y 5s respectivamente y a parte una tarea principal que se ejecutaría en cada ciclo del bucle principal. (podrían ser el número de tareas que queramos).

Lo más importante es que ninguna tarea debe bloquear la ejecución, es decir, no debemos realizar tareas que usen los bloques de esperar ni con  bucles que se queden esperando una condición por ejemplo.

captura-de-pantalla-de-2016-12-01-11-45-21

 

Por ejemplo, siguiendo el ejemplo anterior vamos a ver como realizar que la tarea 1 (cada 3s) enciende y apaga el led (3 segundos encendido/ 3 segundos apagado) y la tarea 2 muestra el estado de un pulsador.

captura-de-pantalla-de-2016-12-01-11-59-34

http://arduinoblocks.com/web/project/556

Todo esto y muchos más ejemplo e información en el libro oficial ArduinoBlocks:

https://www.amazon.es/ArduinoBlocks-Programación-visual-bloques-Arduino/dp/153551328

Compartir