3. FreeRTOS
Es un sistema operativo de tiempo real kernel para dispositivos embebidos que ha
sido portado a 35 plataformas de microcontrolador. Está distribuido bajo el MIT
Licencia.
4. FreeRTOS
FreeRTOS diseñado para ser simple. Proporciona métodos para múltiples subprocesos o hilos , mutexes,
semáforos y temporizadores de software. Además de soportar prioridades de hilos.
Tiene un modo tickless para reducir el consumo energético. En FreeRTOS las aplicaciones pueden
ser asignadas de manera completamente estáticas. Alternativamente en RTOS los objetos pueden ser
asignados de manera dinámica con cinco esquemas previstos de asignación de memoria :
•Solo Asignar.
•Asigna y libera con un algoritmo muy simple y rápido.
• Asignar con un algoritmo más complejo pero rápido de asignación y liberación con coalescencia de memoria
•Asignar con una alternativa al esquema más complejo que incluye la coalescencia de memoria que permite
dividir un montón en múltiples áreas de memoria.
•Biblioteca C asignan y liberan con alguna protección de exclusión mutua.
El énfasis está en la compacidad y la velocidad de ejecución. FreeRTOS se puede considerar como una
'biblioteca de hilos' en lugar de un 'sistema operativo'.
FreeRTOS implementa múltiples subprocesos haciendo que el programa anfitrión llame a un método de
marcación de subprocesos a intervalos cortos y regulares. El método de marca de hilo cambia las tareas en
función de la prioridad y un esquema de programación de turno rotativo. El intervalo habitual es de 1/1000 de
segundo a 1/100 de segundo, a través de una interrupción de un temporizador de hardware, pero este intervalo
a menudo se cambia para adaptarse a una aplicación en particular.
El sitio FreeRTOS.org también contiene una gran cantidad de documentación y tutoriales de RTOS.
5. FreeRTOS
Funviones de Hilo:
void nombreFuncion (void *argumento);
Estados de hilo
Definición y creación de los hilos
osThreadDef (nombre, funcionHILO, prioridad, instancia, stack);
osThreadID NombreManejador;
NombreManejador=osThreadCreate(osThreadDef(nombre), void argument);
osThreadTerminate(NULL);
6. FreeRTOS
Funviones de Hilo:
void nombreFuncion (void *argumento);
Estados de hilo
Definición y creación de los hilos
osThreadDef (nombre, funcionHILO, prioridad, instancia, stack);
osThreadID NombreManejador;
NombreManejador=osThreadCreate(osThreadDef(nombre), void argument);
osThreadTerminate(NULL);
7. FreeRTOS
Escribir un código que permita al sistema operativo en tiempo
real (FreeRTOS) manejar dos hilos de ejecución. En el cual, uno
se encarga de cambiar el estado de un LED cada medio
segundo, mientras que el otro se encargará de trasmitir un
cadena de caracteres utilizando el modulo UART, mostrando
que ambos hilos se “ejecutan” independientemente uno del
otro y en paralelo.
EJEMPLO
13. FreeRTOS
Cuando se utiliza FreeRTOS, se
debe utilizar otra base de tiempo
que no sea la de la librería HAL. Por
tal motivo, en la opción de SYS en
Timebase Source seleccionamos
TIM1 como el generador de la base
de tiempo.
EJEMPLO
GPIO_Output
15. FreeRTOS
Configuramos las opciones de la
comunicación USART1, como la
velocidad (la que mas le conviene
al programador, en este caso será
de 9600 baudios), la longitud del la
palabra de bits, etc.
EJEMPLO
16. FreeRTOS
En la configuración de
FreeRTOS, en la pestaña Tasks
and Queues, aparece una
tarea por defecto llamada
defautTask. Podemos incluir,
por medio del botón Add, mas
tareas, luego podemos
configurar el nombre de estas
tareas y sus funciones
asociadas a estas haciendo
doble click sobre la tarea que
deseamos modificar
EJEMPLO
17. FreeRTOS
Configuramos dos tareas,
llamadas primeraTarea y
segundaTarea, colocamos los
nombres de las funciones de
los hilos que manejara las
tareas independientes, las
cuales son USART y BLINK
EJEMPLO
EJEMPLO
18. FreeRTOS
Cofiguramos la prioridades de los Hilos.
Prioridad mas baja(-3)
Prioridad baja(-2)
Prioridad debajo de lo normal(-1)
Prioridad Normal(0)
Prioridad encima de lo normal(1)
Prioridad Alta(2)
Prioridad Muy Alta(3)
19. FreeRTOS
Seleccionamos el PIN C13 para
colocar el LED que se debe
encender y apagar.
EJEMPLO CONFIGURACION EN LA NUEVA VERSIÓN DE CUBEMX
20. FreeRTOS
Seleccionamos el
USART1 en modo
Asíncrono para
transmitir una cadena
de caracteres.
EJEMPLO
Configuramos las
opciones de la
comunicación USART1,
como la velocidad (la
que mas le conviene al
programador, en este
caso será de 9600
baudios), la longitud
del la palabra de bits,
etc.
CONFIGURACION EN LA NUEVA VERSIÓN DE CUBEMX
21. FreeRTOS
Habilitamos el FreeRTOS (sistema
operativo que nos permite el
manejo de múltiples hilos)
EJEMPLO CONFIGURACION EN LA NUEVA VERSIÓN DE CUBEMX
22. FreeRTOS
EJEMPLO
En la configuración de
FreeRTOS, en la
pestaña Tasks and
Queues, aparece una
tarea por defecto
llamada defautTask.
Podemos incluir, por
medio del botón Add,
mas tareas, luego
podemos configurar el
nombre de estas tareas
y sus funciones
asociadas a estas
haciendo doble click
sobre la tarea que
deseamos modificar
CONFIGURACION EN LA NUEVA VERSIÓN DE CUBEMX
23. FreeRTOS
EJEMPLO
Configuramos dos tareas,
llamadas primeraTarea y
segundaTarea, colocamos los
nombres de las funciones de
los hilos que manejara las
tareas independientes, las
cuales son USART y BLINK
CONFIGURACION EN LA NUEVA VERSIÓN DE CUBEMX
24. FreeRTOS
EJEMPLO
Prioridad mas baja(-3)
Prioridad baja(-2)
Prioridad debajo de lo normal(-1)
Prioridad Normal(0)
Prioridad encima de lo normal(1)
Prioridad Alta(2)
Prioridad Muy Alta(3)
CONFIGURACION EN LA NUEVA VERSIÓN DE CUBEMX
27. FreeRTOS
Cuando se utiliza
FreeRTOS, se debe
utilizar otra base de
tiempo que no sea
la de la librería HAL.
Por tal motivo, en la
opción de SYS en
Timebase Source
seleccionamos TIM1
como el generador
de la base de
tiempo.
EJEMPLO CONFIGURACION EN LA NUEVA VERSIÓN DE CUBEMX
28. FreeRTOS
EJEMPLO
Generamos el código base:
El CubeMx genera de forma
automática:
• El manejador de los Hilos
• Los Hilos implementados
como funciones
• La definición del Hilo
• La creación del Hilo
• La función para iniciar el
proceso del Kernel (las
tareas programadas).
#include "main.h"
#include "stm32f1xx_hal.h"
#include "cmsis_os.h"
UART_HandleTypeDef huart1;
osThreadId primeraTareaHandle;
osThreadId segundaTareaHandle;
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART1_UART_Init(void);
void USART(void const * argument);
void Blink(void const * argument);
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
osThreadDef(primeraTarea, USART, osPriorityNormal, 0, 128);
primeraTareaHandle = osThreadCreate(osThread(primeraTarea), NULL);
osThreadDef(segundaTarea, Blink, osPriorityNormal, 0, 128);
segundaTareaHandle = osThreadCreate(osThread(segundaTarea), NULL);
osKernelStart();
while (1)
{
}
}
29. FreeRTOS
void USART(void const * argument)
{
for(;;)
{
HAL_UART_Transmit(&huart1,(uint8_t*)"HOLA MUNDO !!! ",15,100);
osDelay(300);
}
osThreadTerminate(NULL);
}
void Blink(void const * argument)
{
while (1)
{
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);
osDelay(500);
}
osThreadTerminate(NULL);
}
Generamos el código base:
El CubeMx genera de forma
automática:
• El cuerpo de las funciones de
los Hilos
EJEMPLO
Tanto for(;;) como while(1)
son usados para generar ciclos
infinitos y pueden ser usados de
manera indistinta.