//Cuando se quieren ejecutar un conjunto de instrucciones en nuestra tarjeta arduino estas se ejecutan una despues de otra ciclicamente
//un ejemplo de esto es la intermitencia de dos leds en donde ambis son controlados por tiempos de espera
//por lo que hacer que el efecto de intermitencia funcione debemos encender y a pagar cada uno
// sincronizando los tiempos para que el efecto coincida
//Al utilizar delay estamos deteniendo el programa segun el tiempo programado lo cual es ineficiente puesto que en un sistema real necesitamos que las instrucciones se ejecuten lo mas rapido posible.
#include <Arduino_FreeRTOS.h>
#include <semphr.h> // Incluye la biblioteca de semáforos
#define LED_PIN_1 4
#define LED_PIN_2 7
#define TASK1_PRIORITY 1
#define TASK2_PRIORITY 1
SemaphoreHandle_t xSemaphore; // Declaración de un semáforo
void task1(void *pvParameters); // Declaración de la función de la tarea 1
void task2(void *pvParameters); // Declaración de la función de la tarea 2
void setup() {
pinMode(LED_PIN_1, OUTPUT);
pinMode(LED_PIN_2, OUTPUT);
// Crear el semáforo
xSemaphore = xSemaphoreCreateBinary();
// Inicializar el semáforo en estado "libre"
xSemaphoreGive(xSemaphore); // Inicializa el semáforo con un valor "libre"
xTaskCreate(task1, "Task1", 100, NULL, TASK1_PRIORITY, NULL); // Crea la tarea 1
xTaskCreate(task2, "Task2", 100, NULL, TASK2_PRIORITY, NULL); // Crea la tarea 2
vTaskStartScheduler(); // Inicia el planificador de tareas
}
void loop() {
// No se hace nada en el loop porque las tareas corren en el planificador
}
void task1(void *pvParameters) {
(void) pvParameters;
TickType_t xLastWakeTime = xTaskGetTickCount(); // Obtiene el tiempo actual
while (1) {
// Intentar adquirir el semáforo
if (xSemaphoreTake(xSemaphore, portMAX_DELAY) == pdTRUE) { // Intenta adquirir el semáforo
digitalWrite(LED_PIN_1, HIGH); // Enciende el primer LED
vTaskDelayUntil(&xLastWakeTime, pdMS_TO_TICKS(1000)); // Espera 1 segundo
digitalWrite(LED_PIN_1, LOW); // Apaga el primer LED
// Liberar el semáforo después de usar el recurso compartido
xSemaphoreGive(xSemaphore); // Libera el semáforo
}
vTaskDelayUntil(&xLastWakeTime, pdMS_TO_TICKS(1000)); // Espera 1 segundo
}
}
void task2(void *pvParameters) {
(void) pvParameters;
TickType_t xLastWakeTime = xTaskGetTickCount(); // Obtiene el tiempo actual
while (1) {
// Intentar adquirir el semáforo
if (xSemaphoreTake(xSemaphore, portMAX_DELAY) == pdTRUE) { // Intenta adquirir el semáforo
digitalWrite(LED_PIN_2, HIGH); // Enciende el segundo LED
vTaskDelayUntil(&xLastWakeTime, pdMS_TO_TICKS(1000)); // Espera 1 segundo
digitalWrite(LED_PIN_2, LOW); // Apaga el segundo LED
// Liberar el semáforo después de usar el recurso compartido
xSemaphoreGive(xSemaphore); // Libera el semáforo
}
vTaskDelayUntil(&xLastWakeTime, pdMS_TO_TICKS(1000)); // Espera 1 segundo
}
}