¿Todos los sistemas integrados tienen un sistema operativo?

A menudo no se requiere un sistema operativo, incluso si está utilizando una pila de “middleware” como TCP / IP, USB o un sistema de archivos.

A veces, los chips son demasiado pequeños, por ejemplo, nunca podrá instalar un sistema operativo en el PIC10F200, con solo 256 palabras flash de 12 bits y 16 bytes de RAM.

Cuando se piensa en sistemas operativos para micros, Linux viene a la mente, pero no es realmente adecuado para la mayoría de los sistemas integrados porque Linux estándar no es en tiempo real, y requiere un procesador rápido de 32 bits con una unidad de administración de memoria (MMU) y muchos MB de memoria.

La mayoría de los sistemas operativos en tiempo real para dispositivos integrados no son un sistema operativo completo en el sentido de que Linux lo es; pueden proporcionar solo programación de tareas, comunicación entre procesos (IPC), sincronización de sincronización y servicios de interrupción, esencialmente solo el núcleo. No incluyen todas las utilidades y programas de usuario porque están diseñados para ser utilizados por una aplicación dedicada, en lugar de los usuarios que han iniciado sesión.

Uno de los sistemas operativos en tiempo real (RTOS) más conocidos es FreeRTOS, que ha sido portado a más de 100 microcontroladores. Es uno de los pocos que se ha portado a microcontroladores de 8 bits, a saber, el 8051. Hay docenas de RTOS de código abierto disponibles, principalmente para chips de 32 bits (especialmente ARM), aunque algunos de 16 bits también están representados como las TI MSP430 y PIC24 y dsPIC de Microchip.

Además de la programación de tareas y los otros elementos mencionados anteriormente, una de las cosas que puede proporcionar un RTOS es una capa de abstracción de hardware (HAL) que aísla los detalles del hardware del programador de la aplicación, lo que facilita la escritura de código portátil.

Si uno no está usando un sistema operativo, se dice que el firmware incorporado está “ejecutándose en el metal desnudo”. A menudo, el código toma la forma de un ” super loop “, que llama a múltiples máquinas de estado de nivel inferior. Cada máquina de estado está a cargo de un dispositivo o tarea en particular, como el mantenimiento de un códec o la verificación de pulsaciones de botones, etc.

Por lo tanto, el código podría verse así, para un simple generador de tonos de audio con una interfaz de usuario. Primero main() llama a una rutina para inicializar el sistema (como configurar puertos, etc.), y luego implementa el súper loop, llamando a cada una de las máquinas de tareas de nivel inferior una y otra vez:

int main (nulo)
{
// Inicializa todos los módulos, incluida la aplicación
SYS_Initialize ();

mientras (cierto)
{
// actualizar el controlador de códec
DRV_CODEC_Tasks (sysObj.drvCodec0);

// actualizar gráficos
GFX_Update ();

// mantener la máquina de estado de la aplicación
APP_Tasks ();
}
// La ejecución no debe venir aquí durante la operación normal
volver (EXIT_FAILURE);
}

La máquina de estado de la aplicación APP_Tasks podría parecerse al siguiente código. Primero llama a una máquina de estado de nivel aún más bajo para procesar las pulsaciones de los botones, y luego pasa por los distintos estados para inicializar la aplicación. Después de eso, procesará los botones presionados según sea necesario.

La nota en los botones no necesariamente se sondearía en la máquina de estado, sino que se reconocería antes en una rutina de servicio de interrupción (ISR) desencadenada por un evento de notificación de cambio de puerto y luego se colocaría en una cola para que la máquina de estado la procese más tarde.

Los detalles de la inicialización del códec en sí mismo, que podría tomar varios pasos por su cuenta, se dejan a la máquina de estado del códec llamada en el super loop. Dado que esto tiene lugar de forma asincrónica con respecto a la máquina de estado de la aplicación, cuando finaliza, devuelve un estado de SYS_STATUS_READY.

nulo APP_Tasks (nulo)
{
// verifica si hay cambios en el botón (SW1 … SW5)
button_state = APP_ButtonTask ();

conmutador (appData.state)
{
caso APP_STATE_CODEC_OPEN: // estado inicial
{
si (SYS_STATUS_READY ==
DRV_CODEC_Status (sysObj.drvCodec0))
{
codecData.handle = DRV_CODEC_Open (
sysObj.drvCodec0, DRV_IO_INTENT_WRITE);

if (codecData.handle! = DRV_HANDLE_INVALID)
{
appData.state = APP_STATE_SET_BUFFER_HANDLER;
}
}
}
rotura;

caso APP_STATE_SET_BUFFER_HANDLER:
{
// etcétera etcétera.
}
rotura;

// muchos más estados
}
}

Si está ejecutando en metal desnudo, y no está utilizando un sistema operativo, aún puede obtener los beneficios de usar controladores de dispositivos utilizando un marco como MPLAB Harmony de Microchip, que está disponible para sus dispositivos PIC32. Incluye pilas de USB, Bluetooth y TCP / IP (sin la necesidad de un RTOS) junto con una extensa biblioteca de gráficos. Los ejemplos anteriores se resumen de ese marco. Si lo desea, Harmony también se puede usar con varios RTOS, incluido FreeRTOS.

Eso depende mucho de su definición de “un sistema operativo”. La mayor parte del código incrustado que escribí entre 1980 y 2000 no tenía un “sistema operativo” en el sentido que la mayoría de la gente quiere decir. Tampoco tenían solo un ciclo while (1). Utilizaron un conjunto de bibliotecas para abstraer algunas características de hardware en un hardware bastante variado, y lo que podría pasar para un programador si entrecierra los ojos correctamente, pero no “tareas” (o procesos) a medida que aprende en las clases de CS. Y definitivamente no es un MMU u otro aislamiento forzado por hardware. Demasiados detalles para entrar en una respuesta de Quora. Pero, de todos modos, ¿tenían (a veces) un sistema de archivos y TCP / IP (o UDP o un protocolo de red de datagrama de capa 2 pura) y GUI? Bueno, eran videojuegos que funcionaban con monedas, así que sé el juez. La conclusión es que es posible que no necesite un sistema operativo en el sentido popular, pero si no, debe tener una buena base en los conceptos del sistema operativo.

Después de 2001, hice una buena programación de sistemas embebidos que tenían un sistema operativo (de terceros). Por lo general, un conjunto de “un poco POSIX si no empujas tu suerte” se superpone a un RTOS más antiguo. Esa experiencia también requirió un poco de familiaridad para determinar qué especificación el sistema operativo había violado hoy para hacer ese comportamiento extraño. 🙂

No, no TODOS los sistemas integrados tienen sistemas operativos.

Muchos sistemas integrados son lo suficientemente simples como para que el código exista en un momento (1), con cierto soporte de interrupción.

Desde mi experiencia limitada, los sistemas embebidos desarrollados como un producto para ser vendido tienen algún tipo de sistema operativo. Esto puede variar desde un RTOS muy liviano (ver FreeRTOS) hasta el Linux incrustado más voluminoso. Si desea maximizar la relabilidad y minimizar el consumo de energía, un programador puede ser invaluable.

No. En realidad, el significado común de “programación integrada” significa que su código se ejecutará solo en un microcontrolador dedicado, sin ningún otro SW.

Sin embargo, a medida que las soluciones de SoC se vuelven cada vez menos costosas y tener un sistema operativo común es bastante conveniente, muchos fabricantes de sistemas integrados optan por cambiar, por ejemplo, a las soluciones “Embedded Linux”. Eso resulta básicamente en tener una computadora completa (aunque limitada en recursos) en dispositivos comunes. Tal máquina es mucho más versátil, permite actualizaciones de software fáciles (y automatizadas), etc. También es la base de la idea de Internet de las cosas.

Un sistema incrustado requería un sistema operativo si es necesario una pila TCP / IP o una GUI o un sistema de archivos. Si los requisitos de firmware del producto son lo suficientemente simples como para implementarse con un super loop que se puede mantener. entonces no hay necesidad de un sistema operativo

No, no lo hacen y ¿por qué deberían hacerlo?