Implementación de FreeRTOS en ESP32 con ESP-IDF
1️⃣ Introducción
Ahora que conoces los conceptos fundamentales de un sistema operativo y FreeRTOS (un sistema operativo en tiempo real), aprenderemos a implementarlo usando ESP-IDF en el ESP32.
Nos enfocaremos en: ✅ Crear tareas o procesos que se ejecuten en paralelo. ✅ Asignar tareas a un núcleo específico del ESP32.
2️⃣ Creación del Proyecto en ESP-IDF
Para comenzar, debemos crear un nuevo proyecto en ESP-IDF.
Pasos para crear el proyecto:
1️⃣ Abrir la terminal y ejecutar:
idf.py create-project rtos
Esto creará el proyecto en la ruta:
c:\users\diana\documents\work\platzi\cursos\latest\esp32\rtos
2️⃣ Moverse al directorio del proyecto:
cd .\rtos\
3️⃣ Abrir el proyecto en Visual Studio Code:
code .
4️⃣ Realizar la primera compilación:
idf.py build
3️⃣ Configuración del Código en FreeRTOS
Una vez creado el proyecto, podemos comenzar a escribir código en rtos.c.
Librerías necesarias:
Para trabajar con FreeRTOS en ESP-IDF, importamos:
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
📌 Importante: 🔹 stdio.h → Para printf(). 🔹 freertos/FreeRTOS.h → Funciones y estructuras principales de FreeRTOS. 🔹 freertos/task.h → Gestión de tareas en FreeRTOS.
4️⃣ Creando una Tarea con FreeRTOS
Estructura de una tarea en FreeRTOS
Para crear una tarea, necesitamos definir una función que se ejecutará en un bucle infinito.
📌 Código de la tarea:
void task1(void *args) {
while(1) {
printf("Task 1\n");
}
}
🔹 void *args permite recibir parámetros, aunque en este caso no se usan. 🔹 while(1) mantiene la tarea en ejecución continua.
Creación de la tarea con xTaskCreate()
Para ejecutar la tarea en FreeRTOS, usamos:
TaskHandle_t taskHandle1 = NULL;
void app_main(void) {
xTaskCreate(task1, "task1", 4096, NULL, 10, &taskHandle1);
}
📌 Parámetros de xTaskCreate()
Parámetro
Descripción
task1
Nombre de la función de la tarea
"task1"
Nombre en texto plano
4096
Memoria reservada
NULL
No pasamos argumentos
10
Prioridad de la tarea
&taskHandle1
Referencia para gestionar la tarea
5️⃣ Compilación y Ejecución del Programa
Compilar el código:
idf.py build
Subir el código al ESP32:
idf.py -p COM3 flash
Monitorear la ejecución:
idf.py -p COM3 monitor
📌 Problema detectado: El mensaje Task 1 se imprime sin saltos de línea, dificultando la lectura.
✅ Solución: Modificamos printf() agregando un \n:
printf("Task 1\n");
Recompilamos y volvemos a subir el código:
idf.py build
idf.py -p COM3 flash
idf.py -p COM3 monitor
6️⃣ Problema: La tarea se queda colgada
Después de un tiempo, aparecen warnings en la terminal. Esto sucede porque FreeRTOS detecta que la tarea no se detiene y consume todo el tiempo del procesador.
🚨 ¿Qué hace FreeRTOS en este caso? 🔹 Reinicia automáticamente el sistema para evitar bloqueos.
7️⃣ Solución: Controlando la tarea con un contador
En lugar de ejecutar la tarea indefinidamente, podemos limitar su ejecución usando un contador.
📌 Código actualizado:
void task1(void *args) {
int count = 0;
while (1) {
count++;
printf("Task 1 count: %d\n", count);
if (count > 5) {
vTaskDelete(NULL);
}
}
}
🔹 Se crea una variable count que inicia en 0. 🔹 Cada iteración del while(1), el contador aumenta. 🔹 Si count supera 5, la tarea se elimina con vTaskDelete(NULL).
✅ Resultado esperado: La tarea se ejecuta seis veces y luego se detiene.
8️⃣ Comprobando los cambios en la terminal
Ahora recompilamos y flasheamos el programa:
idf.py build
idf.py -p COM3 flash
idf.py -p COM3 monitor
📌 Resultado en la terminal: 🔹 La tarea Task 1 se ejecuta 6 veces. 🔹 No hay warnings ni reinicios inesperados. 🔹 El sistema operativo sigue funcionando correctamente.