// Una tarea lee retardo por serie y la otra hace parpadear el LED
#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
// Tarea tonta
void testTask(void *pvParameters) {
while (true) {
int a = 1;
int b[100];
// Hace algo con array para que el compilador no lo optimice
for (int i = 0; i < 100; i++) {
b[i] = a + 1; // va a valer 2, como todos los elementos del array
}
Serial.println("b[0] = " + String(b[0]));
// Imprimir memoria restante en el stack (words de 32 bits)
Serial.print("High water mark (words): ");
Serial.println(uxTaskGetStackHighWaterMark(NULL));
// Imprimir numero de bytes libres en heap antes de malloc
Serial.print("Heap before malloc (bytes): ");
Serial.println(xPortGetFreeHeapSize());
// reservamos memoria con malloc() de Vanilla FreeRTOS
int *ptr = (int *)pvPortMalloc(1024 * sizeof(int));
// Para prevenir quedarnos sin heap, comprobar si devuelve NULL
if (ptr == NULL) {
Serial.println("No queda heap, no hago malloc()");
}
else {
// ponemos al procesador a hacer algo, así no optimiza la memoria
for (int i = 0; i < 1024; i++) {
ptr[i] = 3;
}
Serial.print("Heap after malloc (bytes): ");
Serial.println(xPortGetFreeHeapSize());
}
vPortFree(ptr); //libera memoria reservada. Comentar si queremos que se llene
// pequeño retardo
vTaskDelay( 100 / portTICK_PERIOD_MS);
}
}
void setup() {
// Configura serie
Serial.begin(115200);
// Esperamos 1 s para no perdernos la salida serie
vTaskDelay(1000 / portTICK_PERIOD_MS);
// Crearmos la tarea en núcleo 1
xTaskCreatePinnedToCore(testTask, "Tarea test", 1500, NULL, 1, NULL, app_cpu);
// Delete "setup and loop" task para sólo tener una tarea corriendo
vTaskDelete(NULL);
}
void loop() {
// Aquí no llega, he matado el setup() y el loop()
}