// Define o pino do LED
#define LED 21
// Define o pino do botão (BT)
#define BT 22
// Declaração de um semáforo de contagem
SemaphoreHandle_t semaforoContador;
// Declaração do handle da tarefa que trata o botão
TaskHandle_t taskTrataBTHandle;
// Função da tarefa que trata o evento do botão
void vTaskTrataBT(void * pvParameters) {
UBaseType_t x;
while (1) {
// Aguarda até que o semáforo seja liberado pela interrupção do botão
xSemaphoreTake(semaforoContador, portMAX_DELAY);
// Imprime uma mensagem indicando que a interrupção foi tratada
Serial.print("Tratando a ISR do BT: ");
// Obtém o número de eventos pendentes no semáforo
x = uxSemaphoreGetCount(semaforoContador);
Serial.println(x);
// Aguarda 1 segundo antes de continuar o loop
delay(1000);
}
}
// Função de callback da interrupção do botão
void ISR_CallBack() {
// Variável para indicar se uma tarefa de prioridade mais alta foi despertada
BaseType_t xHighPriorityTaskWoken = pdTRUE;
// Libera o semáforo de contagem para sinalizar que a interrupção ocorreu
xSemaphoreGiveFromISR(semaforoContador, &xHighPriorityTaskWoken);
// Se uma tarefa de prioridade mais alta foi despertada, realiza o contexto de troca de tarefas
if (xHighPriorityTaskWoken == pdTRUE) {
portYIELD_FROM_ISR();
}
}
void setup() {
// Inicializa a comunicação serial
Serial.begin(9600);
// Configura o pino do LED como saída
pinMode(LED, OUTPUT);
// Configura o pino do botão como entrada com pull-up interno
pinMode(BT, INPUT_PULLUP);
// Configura uma interrupção no botão para detectar a borda de descida (quando o botão é pressionado)
attachInterrupt(digitalPinToInterrupt(BT), ISR_CallBack, FALLING);
// Cria um semáforo de contagem com capacidade para armazenar até 10 eventos
semaforoContador = xSemaphoreCreateCounting(10, 0);
// Cria a tarefa que trata a interrupção do botão
xTaskCreate(
vTaskTrataBT, // Função da tarefa
"Task BT", // Nome da tarefa
configMINIMAL_STACK_SIZE + 1024, // Tamanho da pilha da tarefa
NULL, // Parâmetro da tarefa
3, // Prioridade da tarefa
&taskTrataBTHandle // Handle da tarefa
);
}
void loop() {
// Liga o LED
digitalWrite(LED, HIGH);
// Aguarda 100 ms
vTaskDelay(pdMS_TO_TICKS(100));
// Desliga o LED
digitalWrite(LED, LOW);
// Aguarda 1000 ms
vTaskDelay(pdMS_TO_TICKS(1000));
}