//Ejemplo de Gestión de Tareas con freeRTOS
//Tarea #1: Parpadea el LED cada 500ms
//Tarea #2: Controla el botón start/stop,
// activando o suspendiendo la tarea 1
// Jorge Iván Marín Hurtado
// Universidad del Quindío
// [email protected]
#define LED_OUT 27
#define BUTTON 14
TaskHandle_t TaskHandleBlinking;
void setup() {
// Crea la tarea en el core 1
xTaskCreate(
TaskBlink, "Blink",
1024, NULL, //Stack
2, //Prioridad 2 (Alta)
&TaskHandleBlinking
);
xTaskCreate(
TaskButton, "Button",
1024, NULL, //Stack
1, //Prioridad 1 (Baja)
NULL
);
}
void loop() {
}
void TaskBlink(void *pvParameters) {
bool led_status = false;
pinMode(LED_OUT, OUTPUT);
while(1) {
digitalWrite(LED_OUT, led_status);
led_status = !led_status;
//Delay 500ms
vTaskDelay( pdMS_TO_TICKS(500) );
}
}
void TaskButton(void *pvParameters) {
bool blinking = true;
pinMode(BUTTON, INPUT_PULLUP);
while(1) {
if (digitalRead(BUTTON)==LOW) {
blinking = !blinking;
if (blinking==false) {
//Suspende la tarea del LED
vTaskSuspend(TaskHandleBlinking);
} else {
//Continua la tarea del LED
vTaskResume(TaskHandleBlinking);
}
}
// Este delay permite eliminar rebotes
vTaskDelay( pdMS_TO_TICKS(50) );
}
}