viernes, 19 de mayo de 2023

¿Qué es un sistema operativo en tiempo real (RTOS)?

Un sistema operativo en tiempo real (RTOS) es un sistema operativo (SO) (a menudo un SO liviano) que ejecuta aplicaciones de subprocesos múltiples y puede cumplir con los tareas en tiempo real. La mayoría de los RTOS incluyen un programador, administración de recursos y controladores de dispositivos. Cuando se habla de "tareas", no necesariamente quiere decir de forma rápida. En cambio, cumplir con las tareas indica un nivel de determinismo, lo que significa que podemos determinar cuándo se ejecutarán ciertas tareas antes del tiempo de ejecución.

Sistema operativo de propósito general versus sistema operativo en tiempo real

A menudo, cuando pensamos en "sistemas operativos", pensamos en cosas como Windows, macOS y Linux. Estos son ejemplos de sistemas operativos de propósito general (GPOS). La mayoría de las veces, estos sistemas operativos están diseñados para la interacción del usuario y proporcionan algún tipo de interfaz, ya sea una interfaz de línea de comandos (CLI) o una interfaz gráfica de usuario (GUI). También están diseñados para ejecutar múltiples aplicaciones, a menudo con subprocesos múltiples, y ofrecen otros beneficios como la administración de recursos/archivos y controladores de dispositivos.


 

Debido a que la interacción del usuario suele ser el enfoque principal para el diseño de GPOS, es aceptable cierta latencia (siempre que los usuarios no noten un retraso prolongado). Como resultado, los plazos exactos de las tareas son difíciles (si no imposibles) de predecir en un GPOS.

Contrasta esto con un RTOS. La mayoría de los RTOS están diseñados para ejecutarse en microcontroladores. Como resultado, a menudo pueden prescindir de interfaces de usuario complejas (por ejemplo, sin línea de comandos o GUI) para realizar algunas tareas a la vez sin necesidad de manejar la entrada del usuario. Además, las aplicaciones escritas para microcontroladores pueden tener plazos de tiempo estrictos que deben cumplirse, como dar un pulso a una compuerta de un transistor cada tantos milisegundos ó realizar una acción para mantener estable la salida ante una perturbación en un proceso industrial.

Muchos RTOS también vienen con bibliotecas de administración de recursos, como la capacidad de leer y escribir en archivos, así como controladores de dispositivos de bajo nivel, como WiFi, Bluetooth y controladores LCD. Tenga en cuenta que los controladores de dispositivos en un RTOS suelen ser mucho más simples que los que se encuentran en un GPOS, ya que generalmente no se les pide a los microcontroladores que hagan cosas como controlar las tarjetas gráficas.

Super Bucle frente a aplicación de subprocesos múltiples

Si ha desarrollado código para un microcontrolador como un PIC o un Arduino , probablemente esté familiarizado con la arquitectura de super bucle (también conocida como "programación completa"). Aquí, no hay un sistema operativo, y la estructura es bastante simple: exite una función main(), donde se definen y configuran las variables, controladores a usar, bibliotecas, etc. y luego realiza una o más tareas periódicas en un ciclo while (true). En Arduino, esto está representado por las funciones setup() y loop() (que son simplemente funciones llamadas desde main() en la biblioteca de Arduino).

 

No hay nada malo con la aplicación de Super Bucle. De hecho, sigue siendo una de las formas más populares de programar un microcontrolador, ya que es fácil de implementar y de depurar. Incluso puede agregar interrupciones mediante el uso de rutinas de servicio de interrupción (ISR) que hacen que el programa se detenga y ejecute algún código arbitrario cuando ocurre un evento externo (como la expiración de un temporizador o la pulsación de un botón).

Si tiene varias tareas que realizar durante el bucle principal, generalmente las ejecuta en forma de turnos rotativos. El problema surge cuando comienzas a agregar tantas tareas que algunas comienzan a perder los plazos o impiden que otras funciones funcionen. Aquí es donde un RTOS puede ayudar. En lugar de ejecutar todo por turnos, básicamente puede ejecutar todo al mismo tiempo.


Todavía puede tener interrupciones: detendrían cualquier tarea que se estuviera ejecutando en ese momento para ejecutar la ISR y luego devolverían la ejecución a la tarea.

Tenga en cuenta que hay cierta terminología que puede resultar confusa aquí:

  • Una tarea es un conjunto de instrucciones cargadas en la memoria. También puede significar alguna unidad de trabajo o meta que debe lograrse.
  • Un subproceso es una unidad de utilización del procesador central (CPU) con su propio contador de programa y memoria de pila.
  • Un proceso es una instancia de un programa de computadora. Un proceso puede tener varios subprocesos. La mayoría de los programas integrados se escriben como un solo proceso, pero un GPOS generalmente tiene muchos procesos ejecutándose al mismo tiempo.

La capacidad de cumplir con los plazos en tiempo real puede o no ser importante según sus necesidades. Si no necesita subprocesos múltiples, es mejor ceñirse a la arquitectura de super bucle, ya que es mucho más fácil de depurar.

Si necesita compatibilidad con subprocesos múltiples, un RTOS también tiene otros beneficios. Es decir, le permite modularizar su código más fácilmente, ya que las tareas se pueden escribir por separado. Si está trabajando en un equipo, las tareas individuales se pueden asignar a diferentes miembros del equipo para permitir el desarrollo simultáneo. Tenga en cuenta que aún habrá depuración al final para garantizar que todo se integre correctamente.

Requisitos de RTOS

Un RTOS requiere cierta sobrecarga, ya que una tarea en segundo plano (el programador) debe ejecutarse regularmente para cambiar de tarea. Esto ocupa memoria y algunos ciclos de CPU. Como resultado, muchos RTOS tienen requisitos mínimos de velocidad de reloj y memoria.


Si bien técnicamente puede ejecutar varios RTOS diferentes en un Arduino UNO (ATmega 328p), la sobrecarga del programador es tan grande que no le quedan muchos recursos para su propia aplicación. Debido a esto, muchos microcontroladores de 8 y 16 bits se utilizan mejor con la arquitectura de super bucle.

A medida que se usan microcontroladores de 32 bits más potentes con relojes más rápidos (p. ej., más de 20 MHz) y más memoria (p. ej., más de 32 kB de RAM), se tienen más recursos disponibles para ejecutar RTOS. Tenga en cuenta que estos no son requisitos estrictos: diferentes RTOS requieren diferentes cantidades de recursos.

El ESP32, que tiene un reloj de 240 MHz, 512 kB de RAM y 2 núcleos. Debido a que fue diseñado como un sistema de Internet de las cosas (IoT), el ESP32 se beneficia de un RTOS. De hecho, la versión Arduino del ESP32 es compatible con FreeRTOS de fábrica (una versión modificada, para ser precisos). 

 

0 comments:

Publicar un comentario