Está en la página 1de 29

Sistema

operativo
en tiempo
real
(FReertos)
FreeRTOS

Sistema Operativo:

KERNEL:

Multitarea en sistemas embebidos

Sistema operativo en tiempo Real o RTOS

FreeRTOS
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.
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.
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);
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);
EJEMPLO
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
FreeRTOS

Seleccionamos el PIN C13 para


colocar el LED que se debe
encender y apagar.
GPIO_Output
EJEMPLO
FreeRTOS

Seleccionamos el
USART1 en modo
Asíncrono para
transmitir una cadena
de caracteres. GPIO_Output
EJEMPLO
FreeRTOS

Habilitamos el FreeRTOS (sistema


operativo que nos permite el
manejo de múltiples hilos)

GPIO_Output
EJEMPLO
FreeRTOS

Habilitamos el cristal externo como


fuente de reloj Externo.

GPIO_Output
EJEMPLO
FreeRTOS
EJEMPLO
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 GPIO_Output
Timebase Source seleccionamos
TIM1 como el generador de la base
de tiempo.
EJEMPLO
FreeRTOS

Configuramos los módulos seleccionados y


algunas opciones del FreeRTOS.
EJEMPLO
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
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
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
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)
EJEMPLO CONFIGURACION EN LA NUEVA VERSIÓN DE CUBEMX

FreeRTOS

Seleccionamos el PIN C13 para


colocar el LED que se debe
encender y apagar.
EJEMPLO CONFIGURACION EN LA NUEVA VERSIÓN DE CUBEMX

FreeRTOS

Seleccionamos el
USART1 en modo
Asíncrono para
transmitir una cadena
de caracteres.

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 CONFIGURACION EN LA NUEVA VERSIÓN DE CUBEMX

FreeRTOS

Habilitamos el FreeRTOS (sistema


operativo que nos permite el
manejo de múltiples hilos)
EJEMPLO CONFIGURACION EN LA NUEVA VERSIÓN DE CUBEMX

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 CONFIGURACION EN LA NUEVA VERSIÓN DE CUBEMX

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 CONFIGURACION EN LA NUEVA VERSIÓN DE CUBEMX

FreeRTOS

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)
EJEMPLO CONFIGURACION EN LA NUEVA VERSIÓN DE CUBEMX

FreeRTOS

Habilitamos el cristal
externo como
fuente de reloj
Externo.
EJEMPLO CONFIGURACION EN LA NUEVA VERSIÓN DE CUBEMX

FreeRTOS
EJEMPLO CONFIGURACION EN LA NUEVA VERSIÓN DE CUBEMX

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
#include "main.h"
#include "stm32f1xx_hal.h"
#include "cmsis_os.h"

FreeRTOS UART_HandleTypeDef huart1;

osThreadId primeraTareaHandle;
osThreadId segundaTareaHandle;

void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART1_UART_Init(void);
Generamos el código base: void USART(void const * argument);
El CubeMx genera de forma void Blink(void const * argument);

automática: int main(void)


• El manejador de los Hilos {
HAL_Init();
• Los Hilos implementados SystemClock_Config();
como funciones MX_GPIO_Init();
MX_USART1_UART_Init();
• La definición del Hilo
• La creación del Hilo osThreadDef(primeraTarea, USART, osPriorityNormal, 0, 128);
primeraTareaHandle = osThreadCreate(osThread(primeraTarea), NULL);
• La función para iniciar el
proceso del Kernel (las osThreadDef(segundaTarea, Blink, osPriorityNormal, 0, 128);
segundaTareaHandle = osThreadCreate(osThread(segundaTarea), NULL);
tareas programadas).
osKernelStart();

while (1)
{

}
}
EJEMPLO
FreeRTOS

void USART(void const * argument)


Generamos el código base: {
El CubeMx genera de forma for(;;)
automática: {
• El cuerpo de las funciones de HAL_UART_Transmit(&huart1,(uint8_t*)"HOLA MUNDO !!! ",15,100);
los Hilos osDelay(300);
}
osThreadTerminate(NULL);
}
Tanto for(;;) como while(1) void Blink(void const * argument)
son usados para generar ciclos {
while (1)
infinitos y pueden ser usados de
{
manera indistinta. HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);
osDelay(500);
}
osThreadTerminate(NULL);
}

También podría gustarte