//Ejemplo de Gestión de Tareas con freeRTOS
//Tarea #1 y #2: Parpadea los LED cada 500ms.
// Usa el mismo código para ambas tareas.
// Muestra el uso del argumento pvParameters
//Tarea #3: Controla el botón start/stop para
// activar o suspender la tarea 1
// Jorge Iván Marín Hurtado
// Universidad del Quindío
// [email protected]
#define LED_OUT 27
#define BUTTON 14
bool blinking = true;
TaskHandle_t TaskHandleBlinking1;
TaskHandle_t TaskHandleBlinking2;
void setup() {
// Crea la tarea en el core 1
xTaskCreate(
TaskBlink, "Blink1",
1024, (void*)27, //Stack
3, //Prioridad 2 (Alta)
&TaskHandleBlinking1
);
xTaskCreate(
TaskBlink, "Blink2",
1024, (void*)26, //Stack
2, //Prioridad 2 (Alta)
&TaskHandleBlinking2
);
xTaskCreate(
TaskButton, "Button",
1024, NULL, //Stack
1, //Prioridad 1 (Baja)
NULL
);
}
void loop() {
}
void TaskBlink(void *pvParameters) {
bool led_status = false;
int pin = (int) pvParameters;
pinMode(pin, OUTPUT);
while(1) {
digitalWrite(pin, led_status);
led_status = !led_status;
//Delay 500ms
vTaskDelay( pdMS_TO_TICKS(500) );
}
}
void TaskButton(void *pvParameters) {
pinMode(BUTTON, INPUT_PULLUP);
while(1) {
if (digitalRead(BUTTON)==LOW) {
blinking = !blinking;
if (blinking==false) {
//Suspende la tarea del LED
vTaskSuspend(TaskHandleBlinking1);
} else {
//Continua la tarea del LED
vTaskResume(TaskHandleBlinking1);
}
}
// Este delay permite eliminar rebotes
vTaskDelay( pdMS_TO_TICKS(50) );
}
}