// Librerías sólo necesarias en WOKWI
#include <Arduino.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
// Usamos solo core 1 para la demo (es más sencillo)
#if CONFIG_FREERTOS_UNICORE
static const BaseType_t app_cpu = 0;
#else
static const BaseType_t app_cpu = 1;
#endif
// cadena a imprimir
const char msg[] = "El patio de mi casa es particular.";
// Tasks handles
static TaskHandle_t tarea_1 = NULL;
static TaskHandle_t tarea_2 = NULL;
// Tarea imprimir serie con prioridad más baja
void startTask1(void *pvParameters)
{
int msg_len = strlen(msg);
// Imprimir en terminal serie
while(true)
{
Serial.println();
for (int i = 0; i < msg_len; i++) {
Serial.print(msg[i]);
}
Serial.println();
vTaskDelay (1000 / portTICK_PERIOD_MS);
}
}
// Tarea 2: imprime en terminal con más prioridad
void startTask2(void *pvParameters) {
while(true)
{
Serial.print('*');
vTaskDelay (100 / portTICK_PERIOD_MS);
}
}
void setup()
{
// Cfg serie lenta para ver preemption
Serial.begin(300);
// esperamos un poco para no perdernos salida serie
vTaskDelay(1000 / portTICK_PERIOD_MS);
Serial.println();
Serial.println("---Demo prioridad tareas FreeRTOS---");
// Imprimimos la prioridad de esta terea
Serial.print("Setup y loop corriendo en core ");
Serial.print(xPortGetCoreID());
Serial.print(" con prioridad ");
Serial.print(uxTaskPriorityGet(NULL));
// Creo tarea 1 con prioridad 1
xTaskCreatePinnedToCore(startTask1, "Tarea 1", 1024, NULL, 1, &tarea_1, app_cpu);
// Creo tarea 2 con más prioridad (2)
xTaskCreatePinnedToCore(startTask2, "Tarea 2", 1024, NULL, 2, &tarea_2, app_cpu);}
void loop()
{
// Suspendemos tarea 2 de más prioridad por intervalos
for (int i = 0; i<5; i++) {
vTaskSuspend(tarea_2);
vTaskDelay(2000 / portTICK_PERIOD_MS);
vTaskResume(tarea_2);
vTaskDelay(2000 / portTICK_PERIOD_MS);
}
// Borramos la tarea de menor prioridad. Comprobamos que no es NULL (existe) antes
// de borrar para no tener problems de memoria
if (tarea_1 != NULL) {
vTaskDelete(tarea_1);
tarea_1 = NULL;
}
}