/*
Author: Juan M. Gandarias
Date: 10/11/2023
Description: ejemplo_multicore
*/
#define POT1_PIN 4 // Potenciómetro 1 conectado a GPIO04
#define POT2_PIN 26 // Potenciómetro 2 conectado a GPIO26
long int t1; // Variable para contar tiempo en la tarea de lectura del sensor1
long int t2; // Variable para contar tiempo en la tarea de lectura del sensor2
TaskHandle_t HandleTask1; // Hande de la tarea 1
TaskHandle_t HandleTask2; // Hande de la tarea 2
void setup()
{
Serial.begin(115200); // Inicialización puerto serie
// Creamos la Tarea 1: Leer del sensor 1
xTaskCreatePinnedToCore(
ReadSensor1, // Nombre de la función en la que se implementa la tarea
"Leer del sensor 1", // 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 1.
0); // Core donde va a correr la tarea 1 (Puede ser core 0 o core 1)
// Creamos la Tarea 2: Leer del sensor 2
xTaskCreatePinnedToCore(
ReadSensor2,
"Leer del sensor 2",
2048,
NULL,
0,
&HandleTask2,
1);
t1 = 0.0; // Inicialización tiempo1
t2 = 0.0; // Inicialización tiempo2
}
void loop()
{
delay(10); // Poner un delay pequeño en el loop para que no caiga el rendimiento en wokwi
}
void ReadSensor1(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 xDelay = 500 / portTICK_PERIOD_MS; // Delay en ticks, en vez de en ms
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
// Mandar datos por puerto serie (core, frecuencia y valor del sensor 1)
Serial.print("Core: ");
Serial.println(xPortGetCoreID());
Serial.println("freq: ");
Serial.println(1 / double((millis() - t1) / 1e3));
Serial.println("Sensor1 value: ");
Serial.println(analogRead(POT1_PIN));
t1 = millis();
//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)
//delay(500);
}
}
void ReadSensor2(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 xDelay = 500 / portTICK_PERIOD_MS; // Delay en ticks, en vez de en ms
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
// Mandar datos por puerto serie (core, frecuencia y valor del sensor 2)
Serial.print("Core: ");
Serial.println(xPortGetCoreID());
Serial.println("freq: ");
Serial.println(1 / double((millis() - t2) / 1e3));
Serial.println("Sensor2 value: ");
Serial.println(analogRead(POT2_PIN));
t2 = millis();
//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)
//delay(500);
}
}