/*Biblioteca do Arduino*/
#include <Arduino.h>
/*Bibliotecas FreeRTOS */
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
/*mapeamento de pinos*/
#define LED 2
#define BUTTON1_PIN 13 //1o botao
#define BUTTON2_PIN 12 //2o botao
// Criação do semáforo binário
SemaphoreHandle_t semaphore;
/* Variáveis para armazenamento do handle das tasks*/
TaskHandle_t taks1Handle = NULL;
TaskHandle_t taks2Handle = NULL;
/*protítipos das Tasks*/
void vTask1(void *pvParameters);
void vTask2(void *pvParameters);
/*função setup*/
void setup() {
pinMode(LED,OUTPUT);
pinMode(BUTTON1_PIN, INPUT_PULLUP);
pinMode(BUTTON2_PIN, INPUT_PULLUP);
// Inicializa o LED
digitalWrite(LED, LOW);
// Criação do semáforo
semaphore = xSemaphoreCreateBinary();
if (semaphore != NULL) {
xSemaphoreGive(semaphore); // Libera o semáforo inicialmente
}
Serial.begin(9600); //configura comunicação serial com baudrate de 9600
/*criação das tasks*/
xTaskCreate(vTask1,"TASK1",configMINIMAL_STACK_SIZE+1024,NULL,1,&taks1Handle);
xTaskCreate(vTask2,"TASK2",configMINIMAL_STACK_SIZE+1024,NULL,2,&taks2Handle);
}
/*função loop*/
void loop() {
//vazio
}
/*
vTask1
*/
void vTask1(void *pvParameters){
while (1) {
if (digitalRead(BUTTON1_PIN) == LOW) { // Botão pressionado
if (xSemaphoreTake(semaphore, portMAX_DELAY) == pdTRUE) {
digitalWrite(LED,!digitalRead(LED));
vTaskDelay(pdMS_TO_TICKS(100));
xSemaphoreGive(semaphore); //libera o semaforo
Serial.println("task1 liberou a semaforo");
}
}
vTaskDelay(pdMS_TO_TICKS(100));
}
}
/*
vTask2
imprime valor de contagem a cada 1 seg
*/
void vTask2(void *pvParameters){
while (1) {
if (digitalRead(BUTTON2_PIN) == LOW) { // Botão pressionado
if (xSemaphoreTake(semaphore, portMAX_DELAY) == pdTRUE) {
digitalWrite(LED,!digitalRead(LED));
vTaskDelay(pdMS_TO_TICKS(100));
xSemaphoreGive(semaphore); //libera o semaforo
Serial.println("task2 liberou a semaforo");
}
}
vTaskDelay(pdMS_TO_TICKS(100));
}
}