FreeRTOS

FreeRTOS
Logo
Familia Sistema operativo en tiempo real
Tipo de núcleo Micronúcleo
Estado del proyecto En desarrollo
Depositar github.com/FreeRTOS/FreeRTOS
Plataformas ARM (ARM7, ARM9, Cortex-M3, Cortex-M4, Cortex-A), Atmel AVR , AVR32 (en) , HCS12 (en) , MicroBlaze , MSP430 , Microcontrôleur PIC , Renesas H8 / S , SuperH , RX, x86 , 8052 , Motorola ColdFire , V850 (en) , 78K0R, serie Fujitsu MB91460, serie Fujitsu MB96340, Nios II (en)
Empresa /
Desarrollador
Amazon, Richard Barry y el equipo de FreeRTOS
Licencia MIT , GNU GPL previamente modificada
Estados de origen Software gratuito para sistema integrado
Escrito en VS
Última versión estable 202012.00-LTS (15 de diciembre de 2020)
Sitio web www.freertos.org

FreeRTOS es un sistema operativo en tiempo real ( RTOS ) pequeña huella , ordenador portátil , preventiva y de código abierto para el microcontrolador . Se ha adaptado a más de 40 arquitecturas diferentes. Creado en 2003 por Richard Barry y el equipo de FreeRTOS, se encuentra hoy entre los más utilizados en el mercado de sistemas operativos en tiempo real.

FreeRTOS está disponible de forma gratuita bajo una licencia MIT desde el 29 de noviembre de 2017. Las versiones anteriores estaban disponibles bajo una licencia GPL modificada y se pueden utilizar sin pago de regalías, esta licencia no obliga a los desarrolladores a publicar el código de su software de aplicación, pero requiere mantener el núcleo de FreeRTOS Open Source. La empresa High Integrity Systems también ofrece una licencia comercial con soporte ad hoc (OpenRTOS).

La cantidad de tareas que se ejecutan simultáneamente y su prioridad solo están limitadas por el hardware. La programación es un sistema de cola basado en semáforos y mutex . Se basa en el modelo Round-Robin con gestión de prioridades. Diseñado para ser muy compacto, consta de solo unos pocos archivos en lenguaje C y no implementa ningún controlador de hardware.

Los campos de aplicación son bastante amplios, ya que las principales ventajas de FreeRTOS son la ejecución en tiempo real, el código fuente abierto y el tamaño muy reducido. Por lo tanto, se utiliza principalmente para sistemas integrados que tienen limitaciones de espacio para el código, pero también para sistemas de procesamiento de vídeo y aplicaciones de red que tienen limitaciones de tiempo real.

Definición

FreeRTOS es un sistema operativo en tiempo real gratuito y de código abierto desarrollado originalmente por Real Time Engineers Ltd.

En 2017, Amazon adquirió el proyecto y su equipo de desarrolladores. También se ha creado una versión específica de FreeRTOS llamada Amazon FreeRTOS, que incluye una serie de bibliotecas que facilitan la integración con la nube de Amazon AWS.

Se ha adaptado a más de 40 arquitecturas diferentes y 15 cadenas de construcción . En 2019, se descargó más de 185.500 veces.

Su diseño es intencionadamente minimalista para que pueda instalarse en sistemas pequeños. La imagen binaria del núcleo pesa entre 4 KB y 9 KB (4,3 KB compilados en ARM7). El kit mínimo tiene solo algunas funciones para administrar tareas y memoria. Además, se implementan colas , semáforos y mutex .

El núcleo de la versión 7.3.0 consta de sólo cinco archivos codificados en lenguaje C . Las secciones en Assembler permiten asegurar la compatibilidad de FreeRTOS con las diferentes arquitecturas de hardware.

Se puede realizar un número ilimitado de tareas simultáneamente y sin restricciones.

Arquitectura

FreeRTOS fue diseñado para ser muy liviano, desde 4KiB hasta 9kiB para una imagen binaria típica del kernel RTOS. El núcleo en sí consta de sólo tres archivos de código fuente escrito en lenguaje C .

El planificador

El propósito principal de la programación de tareas es decidir cuál de las tareas que están en el estado "listo" realizar. Para hacer esta elección, el programador FreeRTOS se basa únicamente en la prioridad de las tareas.

Las tareas en FreeRTOS se asignan a su creación, un nivel de prioridad representado por un número entero. El nivel más bajo es cero y debe reservarse estrictamente para la tarea inactiva . El usuario tiene la posibilidad de anular este nivel con una prioridad personalizada modificando la constante  : tskIDLE_PRIORITY . El número máximo de niveles de prioridad se define mediante la constante: tskMAX_PRIORITIES . Varias tareas pueden pertenecer al mismo nivel de prioridad.

En FreeRTOS no existe un mecanismo automático de gestión de prioridades. La prioridad de una tarea solo se puede cambiar a petición explícita del desarrollador.

Las tareas son funciones simples que generalmente se ejecutan en un bucle infinito y siguen la siguiente estructura genérica:

void vATaskFunction( void *pvParameters ) { for( ;; ) { -- Ajouter le code de votre tâche ici -- } }


En el caso de un microcontrolador que tenga un solo núcleo, habrá en cualquier momento solo una tarea en ejecución. El programador siempre se asegurará de que se seleccione la tarea de mayor prioridad que se puede ejecutar para ingresar al estado de ejecución. Si dos tareas comparten el mismo nivel de prioridad y ambas pueden ejecutarse, las dos tareas se ejecutarán alternativamente con respecto a las activaciones del programador ( round robin ).

Para elegir la tarea que se va a ejecutar, el planificador debe ejecutar él mismo y adelantarse a la tarea en estado de ejecución. Para asegurar la reactivación del planificador, FreeRTOS define una interrupción periódica llamada "interrupción tick". Esta interrupción se ejecuta infinitamente a una cierta frecuencia que se define en el archivo FreeRTOSConfig.h por la constante:

configTICK_RATE_HZ /* Fréquence d’exécution de la "tick interrupt" en Hz. */

Esta constante luego describe el período de tiempo asignado al mínimo para cada tarea o explicado de otra manera, el intervalo que separa dos vigilias del programador.

Como se describe en esta sección, FreeRTOS es, por lo tanto, un RTOS que utiliza programación preventiva para administrar tareas. Sin embargo, también puede utilizar opcionalmente (si se le da la directiva) programación cooperativa . En este modo de programación, un cambio de contexto de ejecución tiene lugar solo si la tarea en ejecución permite explícitamente que se ejecute otra tarea (llamando a Yield () por ejemplo) o luego ingresando a un estado de bloqueo. Por lo tanto, las tareas nunca se adelantan. Este modo de programación simplifica enormemente la gestión de tareas, desafortunadamente puede conducir a un sistema menos eficiente y menos seguro.

FreeRTOS también puede usar programación híbrida, usando programación preventiva y programación cooperativa. En este modo, también puede tener lugar un cambio de contexto de ejecución durante el evento de una interrupción.

La hambruna

En FreeRTOS, el programador siempre seleccionará la tarea de mayor prioridad lista para ejecutarse. Esto puede conducir a una situación de hambruna . Esto se debe a que si la tarea con la prioridad más alta nunca se interrumpe , todas las tareas con una prioridad más baja nunca se ejecutarán. FreeRTOS no implementa ningún mecanismo automático para prevenir el fenómeno de la inanición. El desarrollador debe asegurarse de que no haya tareas que monopolicen todo el tiempo de ejecución del microcontrolador. Para ello, puede colocar eventos que interrumpirán la tarea de mayor prioridad por un tiempo determinado o hasta que ocurra otro evento y dejando así el campo libre para que se ejecuten tareas de menor prioridad.

Para evitar la inanición, el desarrollador puede utilizar la programación de velocidad monótona (RMS). Es una técnica de asignación de prioridades que asigna a cada tarea una prioridad única de acuerdo con su frecuencia de ejecución. La prioridad más alta se asigna a la tarea con la frecuencia más alta de ejecución y la prioridad más baja se le da a la tarea con la frecuencia más baja. La programación a ritmos monótonos permite maximizar la capacidad de programación de las tareas, pero esto sigue siendo difícil de lograr debido a la naturaleza de las tareas que no son totalmente periódicas.

La tarea inactiva

Un microcontrolador siempre debería tener algo que hacer. En otras palabras, siempre debe haber una tarea en ejecución. FreeRTOS gestiona esta situación definiendo la tarea inactiva que se crea cuando se inicia el planificador. La prioridad de kernel más baja se asigna a esta tarea. A pesar de esto, la tarea inactiva puede tener varias funciones que realizar, que incluyen:

  • Libera el espacio ocupado por una tarea eliminada.
  • Coloque el microcontrolador en espera para ahorrar energía del sistema cuando no se esté ejecutando ninguna tarea de aplicación.
  • Mide la tasa de uso del procesador .

Descripción de tareas

En FreeRTOS, cada tarea es descrita por un TCB (Task control Block) que contiene toda la información necesaria para especificar y representar una tarea.

Bloque de control de tareas
Variables Descripción
pxTopOfStack Puntero al último elemento en la parte superior de la pila
xGenericListItem Miembro (xListItem) de la lista utilizada para colocar el TCB en una lista de estados (Listo, bloqueado o suspendido).
xEventListItem Elemento de lista (xListItem) utilizado para colocar el TCB en una lista de eventos.
uxPriority Prioridad de la tarea
pxStack Puntero al inicio de la pila de procesos
pxEndOfStack Puntero al final de la pila de procesos
uxTCBNumber Tamaño de pila en número de variables
pcTaskName Número que se incrementa cada vez que se crea una TCB (se usa para depurar)
uxBasePriority La última prioridad asignada a la tarea.
ulRunTimeCounter Calcula el tiempo empleado por la tarea en un estado de ejecución.
pxTaskTag Le permite agregar una etiqueta a una tarea. El Tag se utiliza para realizar Logs a través de las salidas analógicas o digitales gracias a la función traceSWITCHED_IN ().
uxCriticalNesting Le permite guardar la profundidad de anidamiento de las secciones críticas de esta tarea. Cada vez que la tarea ingresa a una sección crítica, la variable se incrementa, se decrementa tan pronto como la tarea sale de una sección crítica.

Esta variable es necesaria porque es posible que la tarea ceda el control mientras se encuentra en la sección crítica.

Las tareas de FreeRTOS pueden existir en 5 estados: "eliminado", "suspendido", "listo", "bloqueado" o "en ejecución".

En FreeRTOS, no hay una variable para especificar explícitamente el estado de una tarea, a cambio FreeRTOS usa listas de estados. La presencia de la tarea en un tipo de lista de estado determina su estado (lista, bloqueada o suspendida). Como las tareas a menudo cambian de estado, el programador solo tendrá que mover la tarea (el elemento (xListItem) que pertenece a esta misma tarea) de una lista de estados a otra.

Al crear una tarea, FreeRTOS crea y completa el TCB correspondiente a la tarea, luego inserta directamente la tarea en una "Lista lista" (Lista que contiene una referencia a todas las tareas que están en el estado "Listo").

FreeRTOS mantiene varias "listas listas", existe una lista para cada nivel de prioridad. Al elegir la siguiente tarea a ejecutar, el planificador analiza las "listas listas" desde la prioridad más alta hasta la más baja.

En lugar de definir explícitamente un estado "en ejecución" o una lista asociada con él, el kernel FreeRTOS describe una variable "pxCurrentTCB" que identifica el proceso en ejecución. Esta variable apunta a la TCB correspondiente al proceso que se encuentra en una de la 'Lista lista'.

Una tarea puede terminar en el estado "bloqueado" al acceder a una cola de lectura / escritura si la cola está vacía / llena. Cada operación de acceso a la cola se configura con un tiempo de espera (xTicksToWait). Si este tiempo de espera es 0, la tarea no está bloqueada y la operación de acceso a la cola se considera fallida. Si el tiempo de espera no es cero, la tarea pasa al estado "bloqueado" hasta que se modifica la cola (por otra tarea, por ejemplo). Una vez que la operación de acceso a la cola es posible, la tarea verifica que su tiempo de espera no haya expirado y completa con éxito su operación.

Una tarea puede colocarse voluntariamente en el estado "suspendido", luego será totalmente ignorada por el programador y no consumirá más recursos hasta que se elimine del estado y se vuelva a poner en un estado "listo".

El último estado que puede tomar una tarea es el estado "eliminado", este estado es necesario porque una tarea eliminada no libera sus recursos instantáneamente. Una vez en el estado "eliminado", el programador ignora la tarea y otra tarea llamada "IDLE" es responsable de liberar los recursos asignados por las tareas que se encuentran en el estado "eliminado".

La tarea 'IDLE' se crea cuando se inicia el programador y se le asigna la prioridad más baja posible, lo que lleva a una liberación retardada de recursos cuando no se está ejecutando ninguna otra tarea.

Estructuras de datos FreeRTOS

Las listas

Las listas son las estructuras de datos más utilizadas en FreeRTOS. Se utilizan para organizar y programar tareas, así como para implementar colas.

FreeRTOS define varias estructuras para representar listas:

  • La estructura xLIST representa el encabezado de las listas que crea y utiliza el planificador. Por ejemplo, las listas de tareas listas (una lista por nivel de prioridad), la lista de tareas bloqueadas, etc. Esta estructura contiene de alguna manera las otras estructuras de lista utilizadas por FreeRTOS.

La estructura xLIST se define de la siguiente manera:

typedef struct xLIST { volatile unsigned portBASE_TYPE uxNumberOfItems; /* Le nombre d'éléments dans cette liste. */ volatile xListItem * pxIndex; /* Pointeur utilisé pour parcourir cette liste, il pointe successivement sur les éléments (xLIST_ITEM) contenus dans cette liste. */ volatile xMiniListItem xListEnd; /* Élément marquant la fin de cette liste. Elle contient pour cela la valeur maximale de la variable xItemValue dans la liste. */ } xList;


  • La estructura xLIST_ITEM representa los elementos de una lista (de tipo xLIST). Cada elemento de una lista está vinculado a una tarea y las diferentes variables de la estructura xLIST_ITEM se utilizan para organizar las tareas y vincularlas para formar una lista doblemente vinculada.

La estructura xLIST_ITEM se define de la siguiente manera:

struct xLIST_ITEM { portTickType xItemValue; /* Une valeur attribuée à cet élément, cette valeur est utilisée afin de trier la liste (de type (xLIST) contenant cet élément (xLIST_ITEM)) dans un ordre décroissant. */ volatile struct xLIST_ITEM * pxNext; /* Pointeur vers le prochain élément (xLIST_ITEM) dans la liste (xLIST). */ volatile struct xLIST_ITEM * pxPrevious; /* Pointeur vers le précédent élément (xLIST_ITEM) dans la liste (xLIST). */ void * pvOwner; /* Pointeur vers l'objet contenant cet élément, cet objet est, dans la plupart des cas, le TCB d'une tâche. */ void * pvContainer; /* Pointeur vers la liste (xLIST) dans laquelle cet élément est contenu. */ };


  • La estructura XMiniListItem es una versión reducida de XLIST_ITEM . No tiene las variables pvOwner y pvContainer . Representa un elemento que marca el final de esta lista.


Las líneas

Las colas son los principales mecanismos que permiten que las tareas se comuniquen y se sincronicen entre sí.

La estructura básica de una cola se describe a continuación:

typedef struct QueueDefinition { signed char *pcHead; /* Pointeur sur l'octet de début de la file en mémoire */ signed char *pcTail; /* Pointeur sur l'octet de fin de la file en mémoire (un octet de plus que nécessaire, car utilisé comme un marqueur de fin). */ signed char *pcWriteTo; /* Pointeur sur le prochain [[octet]] libre dans la file. */ signed char *pcReadFrom; /* Pointeur sur le dernier octet lu de la file. */ xList xTasksWaitingToSend; /* Liste des tâches (ordonnées par niveau de priorités) qui sont bloquées en attente d’écriture sur la file. */ xList xTasksWaitingToReceive; /* Liste des tâches (ordonnées par niveau de priorités) qui sont bloquées en attente de lecture depuis la file .*/ volatile unsigned portBASE_TYPE uxMessagesWaiting; /* Nombre d'éléments actuellement contenus dans la file. */ unsigned portBASE_TYPE uxLength; /* Taille de la file définit comme le nombre d'éléments maximum qu'elle peut contenir et non le nombre d'octets. */ unsigned portBASE_TYPE uxItemSize; /* Taille de chaque élément (en octet) que la file pourra contenir. */ } xQUEUE;


Una cola contiene un número finito de elementos de tamaño fijo. El tamaño físico de una cola está determinado por el número máximo de elementos que puede contener ( uxLength ) multiplicado por el tamaño en bytes de cada elemento ( uxItemSize ).

En FreeRTOS, la escritura o el envío de datos a una cola se realiza copiando byte a byte e independientemente de su tipo porque la vida útil del elemento guardado es a menudo menor que la vida útil de la cola. Al igual que la operación de escritura, la lectura o recepción de datos también se realiza copiando byte a byte los datos que serán borrados de la cola.

Las colas son objetos independientes, no hay asignación ni pertenencia a una tarea. Son las estructuras que permiten que las tareas se comuniquen entre sí. Como resultado, pueden tener múltiples tareas de lectura y escritura simultáneamente.

Las operaciones de escritura o lectura en las colas pueden ser bloqueantes o no bloqueantes. Las operaciones sin bloqueo devuelven directamente el estado de éxito o error a la cola. Las operaciones de bloqueo se configuran con un timeout que les permite bloquear y que determina el tiempo máximo durante el cual pueden permanecer en este estado.

Administracion de recursos

FreeRTOS utiliza colas como medio de comunicación entre tareas. Sin embargo, las colas también gestionan la sincronización y la competencia entre tareas. Por tanto, esta estructura es el elemento básico para la gestión de recursos en FreeRTOS.

FreeRTOS sincroniza tareas utilizando principalmente dos mecanismos: semáforos y mutex .

Semáforos

FreeRTOS permite la creación y uso de semáforos con varios elementos. Los semáforos se implementan en forma de cola de modo que el número de elementos del semáforo representa el número máximo de elementos que puede contener la cola. La cola que representa el semáforo no guarda ningún dato, solo se ocupa de registrar el número de sus entradas ocupadas actualmente. Por tanto, el tamaño de los elementos de la cola es cero (uxItemSize = 0). Un acceso al semáforo solo aumenta o disminuye el número de entradas ocupadas en la cola y no se realiza ninguna copia del elemento.

La API que ofrece FreeRTOS para administrar semáforos marca la diferencia entre los semáforos de N elementos y los semáforos binarios. Los semáforos binarios pueden verse como colas que solo pueden contener un elemento. Por lo tanto, un semáforo binario solo se puede tomar una vez antes de que deje de estar disponible, a diferencia de un semáforo con n elementos que se pueden tomar varias veces, lo que permite, por ejemplo, definir un número de recursos disponibles o contar el número de eventos que aún deben ser ejecutado.

Mutex

Un mutex se utiliza para proteger un recurso compartido.

La implementación de Mutex en FreeRTOS es similar a la de los semáforos binarios (en forma de cola) excepto que la tarea que toma el Mutex debe devolverlo obligatoriamente. Esto puede verse como la asociación de un token con un recurso, una tarea toma el token y usa el recurso, luego devuelve el token al final, al mismo tiempo que no se puede asociar ningún otro token adicional con la tarea.

Otra diferencia importante entre Mutex y Binary Semaphores en FreeRTOS es el sistema de herencia de prioridad. Cuando varias tareas solicitan tomar un Mutex, la prioridad del titular del Mutex se establece momentáneamente en el valor de la prioridad más alta entre las tareas que esperan su liberación. Esta técnica tiene el efecto de prevenir fenómenos en riesgo de reversión de prioridades aunque no garantice una seguridad infalible frente a estos fenómenos.


Gestión de interrupciones

Una interrupción es un mecanismo puramente de hardware que es implementado e iniciado por este último. FreeRTOS solo proporciona métodos para manejar interrupciones y también puede iniciar interrupciones llamando a una instrucción de hardware.

FreeRTOS no impone a los desarrolladores ninguna estrategia específica para manejar las interrupciones, pero ofrece varios medios para que la estrategia elegida se pueda implementar y mantener fácilmente.

Las rutinas de interrupción (ISR) son funciones ejecutadas por el propio microcontrolador y que no pueden ser administradas por FreeRTOS, lo que puede causar ciertos problemas. Por estas razones, las rutinas de interrupción no pueden utilizar las funciones habituales de la API de FreeRTOS que puede utilizar cualquier otra tarea básica. Sin embargo, FreeRTOS define un grupo de funciones especialmente diseñadas para ISR, por ejemplo, un ISR usará la función xSemaphoreGiveFromISR () en lugar de xSemaphoreGive () , de manera similar, usará la función xQueueReceiveFromISR () en lugar de xQueueReceive () .

Para especificar una política de administración de interrupciones y administrar el acceso a las funciones del kernel específicas de ISR, FreeRTOS define constantes en el archivo de configuración FreeRTOSConfig.h  :

  • configKERNEL_INTERRUPT_PRIORITY  : Define el nivel de prioridad de la interrupción de tiempo ( ang . Tick interrupt) que es una interrupción periódica utilizada para iniciar el programador en cada intervalo de tiempo.
  • configMAX_SYSCALL_INTERRUPT_PRIORITY  : define el nivel de prioridad más alto para el que se pueden utilizar las funciones específicas de ISR de FreeRTOS.

La definición de estas dos constantes permite especificar una política de gestión de ISR según su nivel de prioridades:

  • un ISR con un nivel de prioridad entre configKERNEL_INTERRUPT_PRIORITY y configMAX_SYSCALL_INTERRUPT_PRIORITY podrá utilizar las funciones de la API específicas de los ISR, podrá adelantarse a una tarea, pero no el kernel ni una tarea que ejecute una sección crítica. El planificador no puede apropiarse de él porque la interrupción del temporizador de tick tiene una prioridad más baja.
  • un ISR con un nivel de prioridad estrictamente superior a configMAX_SYSCALL_INTERRUPT_PRIORITY podrá adelantarse al planificador, incluso al ejecutar secciones de código crítico. A cambio, ya no tendrá acceso a ninguna de las funciones de la API FreeRTOS.
  • un ISR que no utilice ninguna de las funciones de la API de FreeRTOS puede utilizar cualquier nivel de prioridad.

La definición de las dos constantes precedentes también agrega al ISR la particularidad del anidamiento de interrupciones ( ang . Anidamiento de interrupciones). El anidamiento de interrupciones es la posibilidad de que se produzca una segunda interrupción al mismo tiempo que un ISR procesa otra interrupción. Esta segunda interrupción puede adelantarse a la primera si tiene una prioridad más alta.

Cabe señalar que las prioridades de las interrupciones están definidas por la arquitectura del microcontrolador. Estas son prioridades de hardware que no tienen relación con las prioridades de software que se pueden asignar a tareas con FreeRTOS.

Interrupciones diferidas

Como se especificó anteriormente, los ISR son secciones de código ejecutadas por el microcontrolador y no por FreeRTOS. Lo que conduce a un comportamiento inesperado del kernel. Por este motivo, es necesario minimizar el tiempo de ejecución de un ISR. Una estrategia para reducir el tiempo de ejecución es utilizar los semáforos binarios que ofrece FreeRTOS. Se puede utilizar un semáforo binario para desbloquear una tarea siempre que se produzca una interrupción en particular. Por lo tanto, la parte de código ejecutada en el ISR se puede reducir en gran medida y la gestión de la interrupción volverá en gran medida a la tarea desbloqueada. Por tanto, habremos aplazado el proceso de interrupción a una tarea sencilla.

Si la interrupción resulta ser crítica, entonces se puede definir la prioridad de la tarea de gestión de interrupciones para que siempre se anteponga a las otras tareas del sistema.

Suspensión de interrupciones

FreeRTOS permite proteger secciones de código que pertenecen a una tarea de cualquier cambio de contexto, de la operación del planificador o incluso de una interrupción que se genere; estas porciones de código se denominan secciones críticas . El uso de secciones críticas puede resultar eficaz para respetar la atomicidad de determinadas instrucciones. No obstante, estas secciones críticas deben utilizarse con precaución porque durante su ejecución el sistema permanece estático y totalmente inactivo hacia otras tareas críticas que estarían bloqueadas o bien hacia interrupciones que señalen eventos externos críticos.

Para definir un fragmento de código como una sección crítica, basta con encerrarlo entre las dos sentencias de sección crítica de inicio y fin: taskENTER_CRITICAL () y taskEXIT_CRITICAL () .

Gestión de la memoria

El kernel de FreeRTOS debe asignar dinámicamente la memoria RAM cada vez que se crea una tarea , una cola o un semáforo . El uso de los métodos tradicionales Malloc () y Free () todavía es posible, pero puede plantear algunos problemas porque no son deterministas y pueden sufrir de memoria demasiado fragmentada. Por lo tanto , existen dos métodos que utilizan los mismos prototipos en FreeRTOS: pvPortMalloc () y vPortFree () .

Cada uno de ellos se implementa de tres formas diferentes descritas en los archivos Heap_1.c , Heap_2.c y Heap_3.c pero el usuario es libre de definir sus propias funciones.

La constante configTOTAL_HEAP_SIZE definida en el archivo de configuración FreeRTOSConfig.h

La primera implementación

Esta versión no define un método para liberar espacio en la memoria RAM.

La memoria se divide en una matriz de tamaño configTOTAL_HEAP_SIZE (en bytes) denominada "la pila FreeRtos".

Cuando el kernel necesita asignar memoria, reserva dos espacios libres para la misma tarea. El primero se utiliza para la TCB, mientras que el segundo representa la cola. Dado que el espacio de memoria para las tareas nunca se libera, la pila se llena hasta que se agota el espacio disponible.

La segunda implementación

Esta representación se diferencia de la primera por el hecho de que tiene un método vPortFree () que libera la memoria asignada para una tarea y puede reasignarla a otra tarea. El tamaño del bloque de memoria de la nueva tarea debe ser como máximo igual al tamaño del bloque de la tarea anterior.

La tercera implementación

Esta es solo una redefinición de Malloc () y Free () pero donde la seguridad se ha incrementado al suspender todas las tareas mientras dure la operación en la memoria.

Caracteristicas

Arquitecturas de hardware compatibles

Servicios prestados y áreas de aplicación

Gracias a su huella de memoria muy pequeña y su puerto en muchas arquitecturas de hardware, FreeRTOS se utiliza principalmente como un sistema operativo integrado. Se ha implementado en dispositivos móviles y se utiliza a menudo en procesadores ARM.

Al ser un sistema operativo puramente orientado al tiempo real que se entrega sin una aplicación, a menudo sirve como base para el desarrollo de API específicas y / o propietarias. Por lo tanto, se utiliza en una amplia variedad de campos donde la restricción en tiempo real es fuerte, como por ejemplo: dispositivos de vigilancia médica, herramientas de control sísmico y ambiental o incluso el control de dispositivos industriales y robots. Sus funciones de gestión de tareas garantizan la integridad de los datos recopilados en tiempo real mediante el uso de los niveles más altos de prioridades.

El campo técnico en el que este sistema en tiempo real es el más utilizado es el de la red, y más concretamente para la transmisión de datos a través de redes inalámbricas. Para redes de muy alta frecuencia como WPAN , en arquitecturas de hardware con muy poca capacidad de memoria, se producen fenómenos de desbordamiento durante los intercambios para sistemas de bucle único. Sin embargo, la implementación de estos intercambios en forma de diferentes tareas complica el desarrollo. Gracias a su gestión de prioridades y su planificador multitarea, FreeRTOS elimina este tipo de problemas. Cada tarea que tiene un bloque reservado, el fenómeno de desbordamiento se elimina porque ya no hay desbordamiento de memoria por falta de recursos.

Para aplicaciones de control como el seguimiento ocular basado en hardware integrado con recursos limitados, FreeRTOS proporciona un núcleo para el sistema básico que administra el hardware, lo que permite agregar aplicaciones específicas. Aquí, de nuevo, es sobre todo el planificador y su sistema de gestión de tareas y prioridad lo que resulta fundamental para este tipo de aplicaciones. El firmware de este dispositivo móvil se compone de 3 capas, la HAL que gestiona la capa de abstracción de hardware, el LED que gestiona los componentes adicionales al procesador y la TAL que es la parte de tareas que gestiona FreeRTOS. Este tipo de aplicación está destinada a adaptarse al usuario según estas reacciones percibidas a través de los movimientos de sus ojos.

FreeRTOS también se usa ampliamente para la implementación de pilas de red y, a menudo, se asocia con uIP. Para dispositivos móviles como teléfonos, incluso se puede encontrar para la gestión de videos. También se utiliza a menudo para implementaciones de capa de red MAC, como el protocolo 802.15.4 ampliamente utilizado para redes de sensores inalámbricos. Uno de los puntos fuertes de FreeRTOS es también su aspecto de código abierto y el hecho de que permite la implementación de capas de red IP muy ligeras y fácilmente portátiles como uIP o lwIP.

Otra área importante de aplicación es la red de sensores inalámbricos . Estos sistemas consisten en un conjunto de sensores que transmiten sus datos a un nodo para posiblemente enviarlos a un sistema central. Este tipo de red está presente en el campo médico para monitorear pacientes o en la agricultura para localizar y monitorear granjas.

FreeRTOS es el sistema operativo en tiempo real de elección en este campo porque los sensores consumen muy poca energía y tienen recursos de RAM muy limitados.

El consumo de energía también es un argumento a favor de FreeRTOS. Los dispositivos móviles de todo tipo tienen esta restricción esencial en común, y este sistema operativo permite el procesamiento en tiempo real al tiempo que garantiza un consumo de energía mínimo.

Con la convergencia de diferentes tecnologías y su miniaturización, FreeRTOS hace posible combinar implementaciones de baterías de red simples y eficientes con necesidades de ahorro de energía. Los nuevos dispositivos móviles como los teléfonos son un buen ejemplo. Esta solución de software también permite reducir considerablemente los costes de fabricación.

Habiéndose llevado a cabo en muchas arquitecturas y con el desarrollo de tarjetas en particular basadas en FPGA integrando tarjetas de red, FreeRTOS hace posible tener sistemas con un sistema adaptado que permita enfocarse en los objetivos finales del proyecto.

Sin embargo, al estar bajo licencia GPL, aunque permita el desarrollo de aplicaciones propietarias, su código fuente debe permanecer abierto y por lo tanto es privilegiado en el campo de la investigación y la educación. Sus competidores propietarios como QNX se eligen con mayor frecuencia en el mundo industrial.

También hay muchos usos diferentes en el campo de la educación. FreeRTOS se utiliza para estudiar la implementación del planificador, la gestión de tareas y la programación modular. También permite desarrollar aplicaciones en el campo de la electrónica como la lectura de temperatura y su visualización.

FreeRTOS también dio origen a frameworks gracias a su código abierto, su pequeño tamaño, su escalabilidad y su extensibilidad. Algunos de estos marcos se utilizan en la industria automotriz.

Soluciones alternativas

Variaciones de FreeRTOS

El proyecto FreeRTOS dio origen a dos versiones de sistemas operativos en tiempo real basados ​​en el kernel FreeRTOS: OpenRTOS y SafeRTOS.

OpenRTOS

OpenRTOS es una versión comercial de FreeRTOS, que incluye un conjunto de controladores de conexión USB, un sistema de archivos FAT y una pila TCP / IP. La licencia comercial libera a los usuarios de OpenRTOS de la obligación de publicar sus modificaciones en el kernel de FreeRTOS y les ofrece el soporte comercial y las protecciones necesarias para sus logros.

OpenRTOS es proporcionada por la empresa de ingeniería global Una licencia en tiempo real Ingenieros Ltd .

SafeRTOS

SafeRTOS es un sistema operativo en tiempo real para el mercado de sistemas críticos . Fue desarrollado por la compañía WHIS (sistemas de alta integridad WITTENSTEIN) en asociación con Tiempo real Ingenieros Ltd .

SafeRTOS y FreeRTOS comparten el mismo algoritmo de programación, la misma API, los mismos requisitos de RAM y ROM y se ejecutan en los mismos tipos de microcontroladores. Sin embargo, se desarrollaron de manera diferente y con diferentes objetivos.

FreeRTOS fue objeto de un estudio HAZOP que identificó varias debilidades funcionales y de comportamiento relacionadas con la API o posibles errores del usuario del sistema. Para abordar estas debilidades, SafeRTOS se ha desarrollado a través de un ciclo de desarrollo IEC 61508 SIL nivel 3. SafeRTOS tiene la certificación SIL3 del organismo de certificación y estandarización alemán TUV (Technischer Überwachungs-Verein).

Una de las grandes peculiaridades de SafeRTOS es su huella de memoria, que no supera los 14KB, lo que le permite residir directamente en la memoria ROM de un microcontrolador. Además, cuando se implementa en ROM, el código SafeRTOS solo se puede usar en su configuración inicial y no se puede cambiar, lo que elimina posibles fallas del sistema relacionadas con errores del usuario y facilita la certificación y validación del sistema basado en kernel SafeRTOS.

SafeRTOS se utiliza en varios sistemas comerciales, incluidos ciertos microcontroladores Stellaris ARM de Texas Instruments .

SafeRTOS es proporcionada por la empresa de ingeniería global Una licencia en tiempo real Ingenieros Ltd .

Premios

  • El sistema operativo en tiempo real más utilizado en 2011 y 2012.
  • El sistema operativo en tiempo real considerado como proyecto de futuro en 2011 y 2012.

Notas y referencias

Referencias

  1. Lanzamiento FreeRTOSv202012.00-LTS  " ,15 de diciembre de 2020(consultado el 31 de marzo de 2021 )
  2. (en-US) “  Anuncio de la versión 10 del kernel de FreeRTOS | Amazon Web Services  ” , Amazon Web Services ,29 de noviembre de 2017( leer en línea , consultado el 30 de junio de 2018 )
  3. Melot 2009+ , p.  4
  4. Contacto, soporte y publicidad para FreeRTOS
  5. (en-US) “  Anuncio de Amazon FreeRTOS: permitir que miles de millones de dispositivos se beneficien de forma segura de la nube | Amazon Web Services  ” , Amazon Web Services ,29 de noviembre de 2017( leer en línea , consultado el 30 de junio de 2018 )
  6. FreeRTOS, Página de inicio
  7. FreeRTOS, Página web: ¿Por qué elegir FreeRTOS? 2007
  8. Barry 2009 , p.  15
  9. Melot 2009+ , p.  08
  10. Barry , 2009 , p.  28
  11. Barry , 2009 , p.  04
  12. Barry , 2009 , p.  05
  13. Barry 2009 , p.  44
  14. Barry , 2009 , p.  19
  15. Melot 2009+ , p.  09
  16. Barry 2009 , p.  29
  17. Svec 2012
  18. Barry , 2009 , p.  32
  19. Barry , 2009 , p.  42
  20. Barry 2009 , p.  47
  21. Melot 2009+ , p.  12
  22. Barry , 2009 , p.  80
  23. Barry , 2009 , p.  83
  24. Barry , 2009 , p.  105
  25. Melot 2009+ , p.  dieciséis
  26. Melot 2009+ , p.  17
  27. Barry 2009 , p.  95
  28. Barry 2009 , p.  94
  29. Barry 2009 , p.  69
  30. Melot 2009+ , p.  18
  31. Barry 2009 , p.  135
  32. Barry , 2009 , p.  138
  33. Barry , 2009 , p.  139
  34. Woodcock 2009 , p.  24
  35. Yu 2009 , p.  2
  36. Wauthy 2010 , p.  3
  37. Bulling 2008 , p.  3
  38. Szczesny 2009 , p.  3
  39. Borchert 2012 , p.  446
  40. Schoofs , 2009 , p.  3
  41. Chen , 2010 , p.  3
  42. Mera 2010
  43. Borchert 2012 , p.  435
  44. Huangfu , 2009 , p.  2
  45. Tardieu 2009 , p.  4
  46. Machanick , 2011 , p.  2
  47. Vanhatupa , 2010 , p.  2
  48. Salminen , 2011 , p.  4
  49. Inam 2011
  50. Visto en 2012 , p.  7
  51. OpenRTOS, página de inicio
  52. SafeRTOS, página de inicio
  53. Yan 2008 , p.  3728
  54. SafeRTOS, vista general
  55. SafeRTOS, Certificación
  56. SafeRTOS de Texas Instruments
  57. Texas Instruments
  58. EETimes Embedded Estudio de mercado del 8 de abril de, 2011

Apéndices

Bibliografía

  • (es) Richard Barry , FreeRTOS: un RTOS GRATUITO para pequeños sistemas integrados en tiempo real ,2005, 112  p. ( leer en línea )
  • (es) Richard Barry , Uso del kernel en tiempo real de FreeRTOS - Una guía práctica ,2009, 163  p. ( presentación en línea )
  • (en) Amy Brown , Greg Wilson y Christopher Svec , La arquitectura de las aplicaciones de código abierto , vol.  2: Estructura, escala y algunos trucos más intrépidos ,2012, 390  p. ( ISBN  9781105571817 , leer en línea ) , cap.  3 ("FreeRTOS")
  • (en) Yan Meng , Johnson Kerry , Brian Simms y Matthew Conforth , "  Una arquitectura genérica de sistema modular integrado para robots móviles en miniatura  " , Robots y sistemas inteligentes, 2008. IROS 2008. Conferencia internacional IEEE / RSJ en ,2008, p.  3725-3730 ( ISBN  978-1-4244-2058-2 , DOI  10.1109 / IROS.2008.4651001 )
  • (en) Ramon Serna Oliver , Ivan Shcherbakov y Gerhard Fohler , "  Una capa de abstracción del sistema operativo para aplicaciones portátiles en redes de sensores inalámbricos  " , Actas del Simposio ACM 2010 sobre Computación Aplicada ,2010, p.  742-748 ( ISBN  978-1-60558-639-7 , DOI  10.1145 / 1774088.1774243 )
  • (en) João F. Ferreira , Guanhua He y Shengchao Qin , “  Verificación automatizada del programador FreeRTOS en HIP / SLEEK  ” , Aspectos teóricos de la ingeniería de software (TASE), Sexto Simposio Internacional 2012 ,2012, p.  51 - 58 ( DOI  10.1109 / TASE.2012.45 )
  • (en) Xiaohan Ji , Dapeng Zhang y Chunmeng Wang , "  Un dispositivo de lectura de medidor de vatios-hora para la asignación de energía eléctrica  " , Inteligencia artificial, ciencia de la gestión y comercio electrónico (AIMSEC), Segunda Conferencia Internacional de 2011 ,2011, p.  3695 - 3697 ( DOI  10.1109 / AIMSEC.2011.6009920 )
  • (en) Bo Qu y Daowei Fan , “  Diseño de un sistema de registro y monitoreo remoto de datos basado en ARM  ” , Sistemas Industriales y de Información (IIS), 2010 2ª Conferencia Internacional ,2010, p.  252-255 ( DOI  10.1109 / INDUSIS.2010.5565698 )
  • (en) Zhuan Yu , Jie Wu , MingPu Xie y Yang Kong , “  Implementación de un sistema distribuido de adquisición de datos en tiempo real de alta precisión  ” , Real Time Conference, 2009. RT '09. 16 ° IEEE-NPSS ,2009, p.  446 - 449 ( DOI  10.1109 / RTC.2009.5321600 )
  • (en) Jinsik Kim y Pai H Chou , "  Actualización remota progresiva con eficiencia energética para firmware basado en flash de sistemas integrados en red  " , Transacciones de ACM sobre automatización de diseño de sistemas electrónicos ,2010, p.  7: 1--7: 26 ( ISSN  1084-4309 , DOI  10.1145 / 1870109.1870116 )
  • (en) David Déharbe , Stephenson Galvão y Anamaria Martins Moreira , “  Formalizando FreeRTOS: Primeros pasos  ” , Métodos formales: Fundamentos y aplicaciones (Lecture Notes in Computer Science) ,2009, p.  101-11703 ( ISBN  978-3-642-10451-0 , DOI  10.1007 / 978-3-642-10452-7_8 )
  • (en) Florin Catalin Braescu , Lavinia Ferariu y Andrei Franciuc , “  Monitorización del rendimiento de CAN en sistemas integrados distribuidos  ” , Teoría, control y computación de sistemas (ICSTCC), 15ª Conferencia Internacional de 2011 ,2011, p.  1-6
  • (en) Tao Xu , "  Evaluación comparativa del rendimiento de FreeRTOS y su abstracción de hardware  " , Tesis doctoral no publicada, Universidad Técnica de Eindhoven ,2008
  • (en) Roman Glistvain y Mokhtar Aboelaze , "  Romantiki OS - Un sistema operativo multitarea de pila única para dispositivos integrados con recursos limitados  " , Informática y sistemas (INFOS), 2010 La séptima conferencia internacional ,2010, p.  1-8
  • (en) Rafia Inam , Jukka Maki-Turja , Mikael Sjodin , SMH Ashjaei y Sara Afshar , "  Support for Hierarchical Scheduling in FreeRTOS  " , Emerging Technologies & Factory Automation (ETFA), 16ª Conferencia IEEE 2011 ,2011, p.  1-10 ( DOI  10.1109 / ETFA.2011.6059016 )
  • (en) Nicolas Melot , “  Sistemas operativos para dispositivos embebidos  ” , Estudio de un sistema operativo: FreeRTOS (Tesis) , 2009+, p.  1-39 ( leer en línea )
  • (en) Aamir Mahmood y Riku Jãntti , "  Precisión de sincronización de tiempo en redes de sensores inalámbricos en tiempo real  " , Comunicaciones (MICC), IEEE 2009 9th Malaysia International Conference ,2009, p.  652 - 657 ( DOI  10.1109 / MICC.2009.5431415 )
  • (en) Per Lindgren , Johan Eriksson , Simon Aittamaa y Johan Nordlander , "  TinyTimber, Reactive Objects in C for Real-Time Embedded Systems  " , Design, Automation and Test in Europe, 2008. FECHA '08 ,2008, p.  1382 - 1385 ( DOI  10.1109 / DATE.2008.4484933 )
  • (en) Jim Woodcock , Peter Gorm Larsen , Juan Bicarregui y John Fitzgerald , “  Métodos formales: práctica y experiencia  ” , ACM Comput. Surv. 41, 4, artículo 19 ,2009, p.  19: 1--19: 36 ( DOI  10.1145 / 1592434.1592436 )
  • (en) Dieu-Huong Vu y Toshiaki Aoki , “  Formalizando fielmente la especificación del sistema operativo OSEK / VDX  ” , Actas del Tercer Simposio sobre Tecnología de la Información y la Comunicación del SoICT '12 ,2012, p.  13 - 20 ( ISBN  978-1-4503-1232-5 , DOI  10.1145 / 2350716.2350721 )
  • (en) Jean-François Wauthy y Laurent Schumacher , "  Implementación de una pila de protocolos IEEE 802.15.4-2006 en el instrumento CC2430 de Texas  " , Actas del séptimo taller de ACM sobre evaluación del rendimiento de redes inalámbricas ad hoc, de sensores y ubicuas , Además de esto, necesita saber más al respecto.2010, p.  33 - 39 ( ISBN  978-1-4503-0276-0 , DOI  10.1145 / 1868589.1868596 )
  • (en) Arto Salminen , Juha-Matti Vanhatupa y Hannu-Matti Järvinen , “  Marco para el curso de programación integrada  ” , Actas de la 11ª Conferencia Internacional Koli Calling sobre Investigación en Educación en Computación ,2011, p.  54 - 59 ( ISBN  978-1-4503-1052-9 , DOI  10.1145 / 2094131.2094142 )
  • (es) Andreas Bulling , Daniel Roggen y Gerhard Tröster , "  Está en sus ojos: hacia la conciencia del contexto y la HCI móvil utilizando gafas EOG portátiles  " , Actas de la décima conferencia internacional sobre computación ubicua ,2008, p.  84 - 93 ( ISBN  978-1-60558-136-1 , DOI  10.1145 / 1409635.1409647 )
  • (en) Samuel Tardieu et Alexis Polti , "  Complementando Ada con otros lenguajes de programación  " , Actas de la conferencia internacional anual ACM SIGAda sobre Ada y tecnologías relacionadas ,2009, p.  105-114 ( DOI  10.1145 / 1,653,616.1647444 )
  • (en) Juha-Matti Vanhatupa , Arto Salminen y Hannu-Matti Järvinen , “  Curso de organización y evaluación sobre programación integrada  ” , Actas de la 10ª Conferencia Internacional Koli Calling sobre Investigación en Educación en Computación ,2010, p.  112-117 ( DOI  10.1145 / 1,930,464.1930484 )
  • (en) David Szczesny , Sebastian Hessel , Felix Bruns et Attila Bilgic , "  Aceleración de hardware sobre la marcha para el procesamiento de la pila de protocolos en dispositivos móviles de próxima generación  " , Actas de la séptima conferencia internacional IEEE / ACM sobre diseño de códigos y sistemas de hardware / software síntesis ,2009, p.  155-162 ( ISBN  978-1-60558-628-1 , DOI  10.1145 / 1,629,435.1629457 )
  • (en) Yu-Ting Chen , Ting-Chou Chien y Pai H. Chou , "  Enix: un sistema operativo dinámico ligero para plataformas de sensores inalámbricos muy restringidos  " , Actas de la 8ª Conferencia de ACM sobre sistemas de sensores integrados en red ,2010, p.  183-196 ( DOI  10.1145 / 1,869,983.1870002 )
  • (en) Philip Machanick , "  Principios de diseño para la computación por contacto  " , Actas de la Conferencia del Instituto Sudafricano de Científicos Informáticos y Tecnólogos de la Información sobre conocimiento, innovación y liderazgo en un entorno diverso y multidisciplinario ,2011, p.  306 - 309 ( DOI  10.1145 / 2072221.2072264 )
  • (en) Wei Huangfu , Limin Sun y Xinyun Zhou , "  NISAT: un banco de pruebas sin efectos secundarios para redes de sensores inalámbricos  " , Actas de la 7ª Conferencia de ACM sobre sistemas de sensores integrados en red ,2009, p.  313 - 314 ( ISBN  978-1-60558-519-2 , DOI  10.1145 / 1644038.1644077 )
  • (en) Per Lindgren , Johan Eriksson , Simon Aittamaa y Johan Nordlander , "  TinyTimber, objetos reactivos en C para sistemas integrados en tiempo real  " , Actas de la conferencia sobre diseño, automatización y pruebas en Europa ,2008, p.  1382 - 1385 ( ISBN  978-3-9810801-3-1 , DOI  10.1145 / 1,403,375.1403708 )
  • (en) Zhuan Yu; Jie Wu; Mingpu Xie; Yang Kong Yu , Jie Wu , Mingpu Xie y Yang Kong , “  Implementación de un sistema distribuido de adquisición de datos en tiempo real de alta precisión  ” , Conferencia en tiempo real, 2009. RT '09. 16 ° IEEE-NPSS ,2009, p.  446 - 449 ( DOI  10.1109 / RTC.2009.5321600 )
  • (en) DE Mera y NG Santiago , “  Técnicas de software de baja potencia para sistemas integrados que ejecutan sistemas operativos en tiempo real  ” , Simposio sobre circuitos y sistemas del Medio Oeste (MWSCAS), 2010 53rd IEEE International ,2010, p.  1061 - 1064 ( DOI  10.1109 / MWSCAS.2010.5548830 )
  • (en) Anthony Schoofs , Charles Daymand , Robert Sugar , Ulrich Mueller , Andreas Lachenmann , Syed M. Kamran , Alain Gefflaut , Lasse Thiem y Mario Schuster , "  Resumen de póster: banco de pruebas basado en IP para el seguimiento de rebaños  " , Actas de la International 2009 Conferencia sobre Procesamiento de Información en Redes de Sensores ,2009, p.  365--366 ( ISBN  978-1-4244-5108-1 )
  • (en) Christoph Borchert , Daniel Lohmann y Olaf Spinczyk , "  CiAO / IP: una pila IP altamente configurable orientada a aspectos  " , Actas de la décima conferencia internacional sobre sistemas, aplicaciones y servicios móviles ,2012, p.  435--448 ( ISBN  978-1-4503-1301-8 , DOI  10.1145 / 2307636.2307676 )

Artículos relacionados

enlaces externos