FreeRTOS es un sistema operativo en tiempo real (RTOS) para sistemas embebidos que proporciona multitarea y sincronización entre tareas de forma eficiente y ligera.
Inicio
Incluir FreeRTOS en un proyecto
Incluir el encabezado principal de FreeRTOS en tu proyecto:
#include "FreeRTOS.h"
#include "task.h"
Gestión de tareas
Creación y administración de tareas
Crear una tarea
Para crear una tarea, se utiliza xTaskCreate
, proporcionando la función de la tarea, nombre, tamaño de pila, parámetros y prioridades.
xTaskCreate(
vTaskCode, // Función de la tarea
"Tarea1", // Nombre de la tarea
1000, // Tamaño de la pila
NULL, // Parámetros
1, // Prioridad
NULL // Manejador de la tarea (opcional)
);
Eliminar una tarea
Para eliminar una tarea:
vTaskDelete(NULL); // Elimina la tarea actual
Suspender una tarea
Para suspender una tarea:
vTaskSuspend(xTaskHandle); // Suspende la tarea con el manejador dado
Reanudar una tarea suspendida
Reanuda la ejecución de una tarea suspendida.
vTaskResume(xTaskHandle); // Reanuda la tarea suspendida
Control de tiempo en tareas
Retrasar una tarea (delay)
Para pausar la tarea durante un período de tiempo determinado (en ticks):
vTaskDelay(pdMS_TO_TICKS(1000)); // Pausa por 1000 ms
Retrasar hasta el siguiente tick
Ajusta la tarea para que se ejecute periódicamente:
vTaskDelayUntil(&xLastWakeTime, pdMS_TO_TICKS(1000)); // Ejecuta cada 1000 ms
Colas
Crear una cola
Crea una cola para pasar datos entre tareas.
xQueueHandle miCola = xQueueCreate(10, sizeof(int)); // Cola de 10 enteros
Enviar datos a una cola
Envía un valor a la cola.
int valor = 42;
xQueueSend(miCola, &valor, portMAX_DELAY); // Envía el valor con espera máxima
Recibir datos de una cola
Recibe un valor de la cola.
int valorRecibido;
xQueueReceive(miCola, &valorRecibido, portMAX_DELAY); // Recibe con espera máxima
Enviar desde una interrupción
Para enviar un mensaje a una cola desde una interrupción:
xQueueSendFromISR(miCola, &valor, &xHigherPriorityTaskWoken);
Semáforos
Semáforos binarios
Crear un semáforo binario
Utilizado para la sincronización de tareas.
xSemaphoreHandle miSemaforo = xSemaphoreCreateBinary();
Tomar un semáforo
Toma el semáforo para bloquear la ejecución hasta que se libere.
xSemaphoreTake(miSemaforo, portMAX_DELAY); // Bloquea indefinidamente hasta que se libere
Liberar un semáforo
Libera el semáforo, permitiendo que otras tareas lo tomen.
xSemaphoreGive(miSemaforo); // Libera el semáforo
Semáforos Mutex
Crear un Mutex
Mutex para evitar acceso simultáneo a recursos compartidos.
xSemaphoreHandle miMutex = xSemaphoreCreateMutex();
Tomar y liberar un Mutex
Funciona igual que los semáforos binarios, pero el Mutex debe ser tomado y liberado por la misma tarea.
xSemaphoreTake(miMutex, portMAX_DELAY); // Tomar el Mutex
xSemaphoreGive(miMutex); // Liberar el Mutex
Temporizadores
Crear un temporizador
Crea un temporizador que dispare una función después de un periodo de tiempo.
xTimerHandle miTemporizador = xTimerCreate(
"Temporizador1", // Nombre
pdMS_TO_TICKS(1000), // Período de 1000 ms
pdTRUE, // Temporizador repetitivo
(void*)0, // ID de temporizador (opcional)
vTimerCallback // Función de callback
);
Iniciar un temporizador
Inicia un temporizador.
xTimerStart(miTemporizador, 0);
Parar un temporizador
Detiene un temporizador antes de que se dispare.
xTimerStop(miTemporizador, 0);
Cambiar el período de un temporizador
Modifica el período del temporizador en tiempo de ejecución.
xTimerChangePeriod(miTemporizador, pdMS_TO_TICKS(500), 0); // Cambia a 500 ms
Interrupciones
Configurar interrupciones
Las funciones ISR (Interrupciones de Servicio) pueden utilizar funciones de FreeRTOS como xQueueSendFromISR
o xSemaphoreGiveFromISR
para interactuar con las tareas.
Ejemplo de manejo de interrupción:
void ISR_Handler(void) {
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
xSemaphoreGiveFromISR(miSemaforo, &xHigherPriorityTaskWoken);
portYIELD_FROM_ISR(xHigherPriorityTaskWoken); // Cambia de contexto si es necesario
}
Control de memoria
Comprobación de memoria disponible
FreeRTOS incluye una función para verificar la cantidad de memoria libre disponible en el heap.
size_t memoriaDisponible = xPortGetFreeHeapSize();
Definir el tamaño del stack de una tarea
Al crear una tarea, se puede especificar el tamaño de pila (stack) que se asignará:
xTaskCreate(vTaskCode, "Tarea", configMINIMAL_STACK_SIZE, NULL, 1, NULL);