#define pinLedRed 2
#define pinLedGreen 4
#define pinLedBlue 16
TaskHandle_t handleTask1; // Definir Handle de la tarea 1
TaskHandle_t handleTask2; // Definir Handle de la tarea 2
TaskHandle_t handleTask3; // Definir Handle de la tarea 3
void setup() {
Serial.begin(115200);
Serial.println("Hello, ESP32!");
Serial.println(portTICK_PERIOD_MS);
pinMode(pinLedRed, OUTPUT);
pinMode(pinLedGreen, OUTPUT);
pinMode(pinLedBlue, OUTPUT);
digitalWrite(pinLedRed, LOW);
digitalWrite(pinLedGreen, LOW);
digitalWrite(pinLedBlue, LOW);
// Creamos la Tarea 1
xTaskCreatePinnedToCore(
RedThread, // Nombre de la función en la que se implementa la tarea
"Manejar el led rojo", // Descripción de la tarea
2048, // Memoria (en Bytes) asignados a esta tarea (no poner muy alta)
NULL, // Parámetro de entrada de la tarea (no hay ningún parámetro)
0, // Prioridad de la tarea (cuanto más alto, más prioridad. No interesa por ahora, sólo cuando haya varias tareas en un mismo core)
&handleTask1, // Handle (manejador) de la tarea (definido arriba)
0); // Core donde va a correr la tarea (Puede ser core 0 o core 1)
// Creamos la Tarea 2
xTaskCreatePinnedToCore(
BlueThread, // Nombre de la función en la que se implementa la tarea
"Manejar el led azul", // Descripción de la tarea
2048, // Memoria (en Bytes) asignados a esta tarea (no poner muy alta)
NULL, // Parámetro de entrada de la tarea (no hay ningún parámetro)
0, // Prioridad de la tarea (cuanto más alto, más prioridad. No interesa por ahora, sólo cuando haya varias tareas en un mismo core)
&handleTask2, // Handle (manejador) de la tarea (definido arriba)
1); // Core donde va a correr la tarea (Puede ser core 0 o core 1)
// Creamos la Tarea 3
xTaskCreatePinnedToCore(
GreenThread, // Nombre de la función en la que se implementa la tarea
"Manejar el led verde", // Descripción de la tarea
2048, // Memoria (en Bytes) asignados a esta tarea (no poner muy alta)
NULL, // Parámetro de entrada de la tarea (no hay ningún parámetro)
0, // Prioridad de la tarea (cuanto más alto, más prioridad. No interesa por ahora, sólo cuando haya varias tareas en un mismo core)
&handleTask3, // Handle (manejador) de la tarea (definido arriba)
1); // Core donde va a correr la tarea (Puede ser core 0 o core 1)
}
void loop() {
// put your main code here, to run repeatedly:
delay(10); // this speeds up the simulation
}
void RedThread (void *parameter) {
// 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
xLastWakeTime = xTaskGetTickCount (); // Se inicializa la variable xLastWakeTime con el tiempo en ticks actual
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(pinLedRed, !digitalRead(pinLedRed));
}
}
void BlueThread (void *parameter) {
TickType_t xLastWakeTime;
const TickType_t xPeriod = 1000 / portTICK_PERIOD_MS;
xLastWakeTime = xTaskGetTickCount ();
while (1) {
vTaskDelayUntil( &xLastWakeTime, xPeriod);
digitalWrite(pinLedBlue, !digitalRead(pinLedBlue));
}
}
void GreenThread (void *parameter) {
TickType_t xLastWakeTime;
const TickType_t xPeriod = 2000 / portTICK_PERIOD_MS;
xLastWakeTime = xTaskGetTickCount ();
while (1) {
vTaskDelayUntil( &xLastWakeTime, xPeriod);
digitalWrite(pinLedGreen, !digitalRead(pinLedGreen));
}
}