Tutorial - Multitarea Con ArduinoBlocks
Tutorial - Multitarea Con ArduinoBlocks
Juanjo López
http://www.arduinoblocks.com
Introducción
Dentro del entorno Arduino hay que destacar al Arduino MEGA, que aún siendo también
modesto, nos ofrece un poco más de potencia y capacidad de memoria que sus hermanos
pequeños UNO y Leonardo.
El problema la mayoría de las veces es que desaprovechamos mucha potencia por la forma
en que programamos nuestro Arduino.
El microcontrolador sólo puede hacer una cosa a la vez, sólo puede ejecutar una instrucción
de programa al mismo tiempo pues sólo tenemos un núcleo de procesamiento (no hay multi-core
como en otros microcontroladores más potentes). Por lo que la única forma de simular una
multitarea sería partir nuestro programa en pequeñas tareas y darle un tiempo a cada uno, y los más
importante… ¡¡¡ que ninguna bloquee la ejecución del procesador durante mucho tiempo !!! Pues en
ese caso las demás tareas se quedarán en el olvido... y ésto, a veces es fácil de implementar, pero
otras no tanto…
La opción que usan los sistema multitarea con un sólo procesador (por ejemplo los
ordenadores que hasta no hace muchos años sólo tenían un núcleo) es implementar una capa por
software que se encargue de gestionar el tiempo del microprocesador y dar a cada tarea el tiempo
que crea que es necesario para que se ejecute correctamente… Esta tarea la realiza… ¡el sistema
operativo!
Arduino no tiene un sistema operativo, pero sí podemos añadir una librería que nos haga las
funciones de un sistema operativo, por lo menos en cuanto a la gestión del tiempo se refiere. Existen
diferentes implementaciones para gestionar una multitarea más o menos real en Arduino, pero
siempre tenemos que tener en cuenta la capacidad limitada de Arduino y que si le pedimos más de
lo que puede procesar, el microcontrolador no dará a basto y no podrá ejecutar todas las tareas en
tiempo real o incluso se reiniciará.
Esquema con 3 tareas que se van alternando, y en apariencia parece que las 3 se ejecutan a
la vez, en este caso el tiempo de procesador se divide igual para cada tarea:
Los planificadores de multitarea permiten además asignar a cada tarea una prioridad, para así
darle preferencia a las tareas más críticas o que necesitan más tiempo de procesamiento. Si
creamos muchas tareas con “alta” prioridad puede que afectemos a las demás dejando poco tiempo
de procesamiento para ellas…
Con esta introducción teórica a la multitarea, debemos hacernso otra pregunta… ¿Qué pasa
si una tarea accede a un recurso o variable, y el sistema multitarea le da el control a otra tarea y por
tanto ese proceso falla o quizás otra tarea acceda al mismo recurso y se solapen?
Para ese problema de convivencia entre tareas se inventaron los “semáforos”, en concreto el
que más nos interesa es el semáforo “mutex” o de exclusión mutua, que permite que bloqueemos el
sistema multitarea, hagamos lo que tengamos que hacer crítico, y luego liberemos el control. Por
supuesto estas tareas críticas deben ser lo más cortas y atómicas posibles: una escritura crítica en
una variable, un envío de un dato, una actualización de una pantalla LCD,... siempre cosas simples.
Los semáforos debemos usarlos en casos que tengamos claro que se pueden crear conflictos, pues
su abuso puede hacer que el sistema multitarea empiece a fallar.
Y por último, pero no menos importante ¿Qué pasa con los bloques tipo “esperar” que
estaban tan prohibidos en la programación de Arduino cuando queríamos simular una multitarea
antes de tener estos bloques? Pues seguimos teníendoles bastante tirria. Aunque en teoría
podríamos usarlos, un bloque esperar hace pensar al microcontrolador que está haciendo algo útil,
cuando en realidad no es así, por lo que el sistema multitarea querrá asignarle tiempo de
procesamiento a la tarea, aunque sea para eso… ¡para no hacer nada!
Tenemos una solución, tenemos un nuevo bloque de esperar “task friendly” que en lugar de
esperar sin hacer nada le dice al sistema: ¡voy a estar un rato sin hacer nada, permite ejecutar otras
tareas mientras y luego vuelves! ….Mucho más “friendly”, claro que sí.
Bloques
Con toda esta información pasamos a ver los bloques disponibles para poner todo ésto en
marcha y después algunos ejemplos:
IMPORTANTE:
Puede haber bloques que sean incompatibles con el sistema de multitarea (conflictos en las
librerías internas, que utilizan los mismos recursos). En ese caso al utilizar los bloques
correspondientes el sistema podría dejar de funcionar o funcionar de forma inestable.