Cómo utilizar un sistema operativo en tiempo real para microcontroladores (RIOT-OS)

Introducción
Un sistema operativo en un conjunto de programas que tienen la capacidad de correr un conjunto de otros programas o aplicaciones. Por ejemplo, un sistema operativo puede tener un programa que monitorea una variable mediante un sensor, otro programa que acciona un actuador y otro proceso que maneja una interfaz de usuario.

La manera antigua de lograr que un microcontrolador realize múltiples tareas es mediante interrupciones y/o utilizando funciones no bloqueantes en el flujo del programa. La manera antigua de lograr que un microcontrolador realize multiples funciones tiene desventajas si se le compara a un sistema operativo para microcontroladores:
  • Existen interrupciones limitadas: En un microcontrolador, existen fuentes limitadas de interrupciones, por ejemplo, la familia SAM D21 de ATMEL tienen 9 interrupciones de timer. En un sistema operativo, la cantidad de procesos independientes están limitadas por la memoria disponible y limitaciones del sistema operativo. El sistema operativo que se analizará (RIOT-OS) tiene un máximo de 32 procesos.
  • Los timers tienen distintos tipos de configuracion, por que que lograr el mismo comportamiento entre dos timers distintos requiere esfuerzo adicional.
  • El código en un sistema operativo es portable, es decir, se puede transferir el código de un tipo de microcontrolador a otro con poco esfuerzo, ya que las llamadas a las funciones son universales.
  • Las interrupciones necesitan utilizar variables globales. Esto es evitable al utilizar un sistema oprativo utilizando técnicas de inter-process communication (IPS). Las variables globales a veces son justificadas, pero se debería tratar de minimizar su uso para mantener el código.
Utilizando un sistema operativo en tiempo real
En este ejemplo, se utilizará RIOT-OS, un sistema operativo en tiempo real basado en prioridades. En un sistema operativo basado en prioridades, cada proceso tiene una prioridad asignada. Además este sistema operativo es bloqueante (preemtive), esto quiere decir que un proceso con mayor prioridad tiene la capacidad de bloquear un proceso de menor prioridad.

No es necesario tener un microcontrolador para probar algunas de las funcionalidades que entrega RIOT os. Vamos a correr el programa que iría en el microcontrolador en el computador.

Para utilizar RIOT-OS es necesario tener un computador con Linux o Mac. Aquí se muestra en Ubuntu 16.04 LTS:
sudo apt-get install update
sudo apt-get install git gcc-multilib
git clone https://github.com/RIOT-OS/RIOT
cd RIOT/examples/hello-world
make all term
Con esto se debería ejecutar el ejemplo hello-world y se debería ver:
main(): This is RIOT! (Version: 2018.07-devel-839-g6244c-tom-X405UQ)
Hello World!
You are running RIOT on a(n) native board.
This board features a(n) native MCU.