/* se utiliza xTaskCreatePinnedToCore()
para permitirnos seleccionar que núcleo del ESP32 (núcleo 0 o núcleo 1) ejecutará la tarea en particular.
se utiliza uxTaskGetStackHighWaterMark()
para saber cuanta RAM se esta usando una tarea
*/
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#define PRO_CPU 0 // core 0 para comunicaciones
#define APP_CPU 1 // core 1 para aplicaciones
#define buzer 4
#define LED 15
#define LED_RED 4
TaskHandle_t LEDBlinking = NULL; /// Task handler para la función del LED
TaskHandle_t LEDBlinking2 = NULL;
//==============================================================================================//
// Function to be implemented the LED task is called
void BlinkingLED(void *arg){
while(true){
Serial.println("\nLED_Task Blue en Core0");
Serial.print("Memoria High Water Mark en WORDS:");
Serial.println(uxTaskGetStackHighWaterMark(NULL));
Serial.print("Tamaño del HEAP antes de la asignación en BYTES:");
Serial.println(xPortGetFreeHeapSize());
Serial.println("Llamando a la función TestHwn:");
TestHwm("BlinkingLED");
digitalWrite(LED, HIGH);
vTaskDelay(250/ portTICK_RATE_MS);
digitalWrite(LED, LOW);
vTaskDelay(250/ portTICK_RATE_MS);
//TestHwm("BlinkingLED");
}
}
void BlinkingLED2(void *arg){
while(true){
Serial.println("\nLED_Task Red en Core1");
Serial.print("Memoria High Water Mark en WORDS:");
Serial.println(uxTaskGetStackHighWaterMark(NULL));
Serial.print("Tamaño del HEAP antes de la asignación en BYTES:");
Serial.println(xPortGetFreeHeapSize());
int *ptr= (int*)pvPortMalloc(1024 * sizeof(int));
if (ptr ==NULL) {
Serial.println("No espacio en HEAP");
}else{
digitalWrite(LED_RED, HIGH);
vTaskDelay(2000/ portTICK_RATE_MS);
digitalWrite(LED_RED, LOW);
vTaskDelay(2000/ portTICK_RATE_MS);
}
}
}
// Tester: permite saber cuanta RAM no se esta usando una tarea y considerar el valor mas cercano mayor con 2^n
// Considerar que el maximo de RAM es 2^12 = 4096 bytes
// Esta funcion ocupa 512 bytes
void TestHwm(char *taskName){
static int stack_hwm, stack_hwm_temp;
stack_hwm_temp = uxTaskGetStackHighWaterMark(nullptr);
if(!stack_hwm || (stack_hwm_temp < stack_hwm)){
stack_hwm=stack_hwm_temp;
Serial.printf("\n%s tiene como stack hwm: %u\n",taskName,stack_hwm);
}
}
//===========================================================================================//
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
pinMode(LED, OUTPUT);
pinMode(LED_RED, OUTPUT);
Serial.println("Hola, ESP32 con FreeRTOS !!!!!");
xTaskCreatePinnedToCore(
BlinkingLED,
"BlinkingLED",
1600,
NULL,
10,
&LEDBlinking,
PRO_CPU
);
xTaskCreatePinnedToCore(
BlinkingLED2,
"BlinkingLED2",
1024,
NULL,
10,
&LEDBlinking2,
APP_CPU
);
}
void loop() {}