/**************************************************************************
Manuel Córdoba Ramos
En este ejercicio se pide realizar un programa con 3 tareas.
- La tarea 1 hace parpadear el led rojo cada medio segundo (0,5s) [Core 0]
- La tarea 2 el led azul cada segundo (1s) [Core 1]
- La tarea 3 el verde cada dos segundos (2s) [Core 1]
***************************************************************************/
#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
1024, // 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
1024, // 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
1024, // 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) {
const TickType_t xDelay = 500 / portTICK_PERIOD_MS; // Delay en ticks, en vez de en ms. El 500 son ms
// En este caso, portTICK_PERIOD_MS vale 1, pero por si acaso
while (1) {
digitalWrite(pinLedRed, !digitalRead(pinLedRed));
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)
}
}
void BlueThread (void *parameter) {
const TickType_t xDelay = 1000 / portTICK_PERIOD_MS;
while (1) {
digitalWrite(pinLedBlue, !digitalRead(pinLedBlue));
vTaskDelay(xDelay);
}
}
void GreenThread (void *parameter) {
const TickType_t xDelay = 2000 / portTICK_PERIOD_MS;
while (1) {
digitalWrite(pinLedGreen, !digitalRead(pinLedGreen));
vTaskDelay(xDelay);
}
}