#define LED_RED 2
#define LED_GREEN 16
#define LED_BLUE 4
TaskHandle_t HandleTaskRed; // Handle de la tarea 1
TaskHandle_t HandleTaskBlue; // Handle de la tarea 2
TaskHandle_t HandleTaskGreen; // Handle de la tarea 3
// Tarea encender LED rojo
void RedLEDTask(void *pvParameter)
{
const TickType_t xDelay = 500 / portTICK_PERIOD_MS; // Delay en ticks, en vez de en ms
// En este caso, portTICK_PERIOD_MS vale 1, pero por si acaso
while (1)
{
digitalWrite(LED_RED, !digitalRead(LED_RED));
vTaskDelay(xDelay); // Se bloquea la tarea los ticks definidos en xDelay (no tiene en cuenta el tiempo de ejecución del resto de código de la tarea)
}
}
// Tarea encender LED blue
void BlueLEDTask(void *pvParameter)
{
// Constantes/variables locales de esta tarea (pueden tener el mismo nombre en varias tareas sin estorbarse)
TickType_t xLastWakeTime; // Variable que almacena el tiempo en ticks de la última vez que la tarea se puso running
const TickType_t xPeriod = 500 / portTICK_PERIOD_MS; // Periodo en ticks, en vez de en ms
// Se inicializa la variable xLastWakeTime con el tiempo en ticks actual
xLastWakeTime = xTaskGetTickCount ();
while (1)
{
vTaskDelayUntil( &xLastWakeTime, xPeriod); // Espera hasta el siguiente ciclo. La variable xLastWakeTime se pasa por referencia, con lo que se actualiza cada vez que se ejecuta
digitalWrite(LED_BLUE, !digitalRead(LED_BLUE));
}
}
// Tarea encender LED verde
void GreenLEDTask(void *pvParameter)
{
while (1)
{
digitalWrite(LED_GREEN, !digitalRead(LED_GREEN));
vTaskDelay(2000);
}
}
void setup()
{
Serial.begin(115200); // Inicialización puerto serie
Serial.println("Hello, ESP32!");
pinMode(LED_RED, OUTPUT); // Configurar LED como output
pinMode(LED_GREEN, OUTPUT); // Configurar LED como output
pinMode(LED_BLUE, OUTPUT); // Configurar LED como output
// Creamos la Tarea 1: CPU0
xTaskCreatePinnedToCore(
RedLEDTask, // Funcion en la que se implementa la tarea
"Tarea Pin Rojo", // Nombre de la tarea
configMINIMAL_STACK_SIZE, // Memoria (en Bytes) asignados a esta tarea
NULL, // Parámetro de entrada de la tarea (no hay ningún parámetro)
1, // Prioridad de la tarea (cuanto más alto, más prioridad)
&HandleTaskRed, // Handle de la tarea 1
0); // Core donde va a correr la tarea 1
// Creamos la Tarea 1: CPU0
xTaskCreatePinnedToCore(
BlueLEDTask, // Funcion en la que se implementa la tarea
"Tarea Pin Azul", // Nombre de la tarea
configMINIMAL_STACK_SIZE, // Memoria (en Bytes) asignados a esta tarea
NULL, // Parámetro de entrada de la tarea (no hay ningún parámetro)
1, // Prioridad de la tarea (cuanto más alto, más prioridad)
&HandleTaskBlue, // Handle de la tarea 2
1); // Core donde va a correr la tarea 2
// Creamos la Tarea 1: CPU0
xTaskCreatePinnedToCore(
GreenLEDTask, // Function en la que se implementa la tarea
"Tarea Pin Verde", // Nombre de la tarea
configMINIMAL_STACK_SIZE, // Memoria (en Bytes) asignados a esta tarea
NULL, // Parámetro de entrada de la tarea (no hay ningún parámetro)
1, // Prioridad de la tarea (cuanto más alto, más prioridad)
&HandleTaskGreen, // Handle de la tarea 3
1); // Core donde va a correr la tarea 3
Serial.println(portTICK_PERIOD_MS);
}
void loop()
{
delay(10);
}