/* Pino do LED */
byte ledPin = 21;
/* Pino que está conectado à interrupção */
byte interruptPin = 22;
/* Armazena o estado do LED ao alternar */
volatile byte state = LOW;
SemaphoreHandle_t xCountingSemaphore;
int cont=0;
/* Função de callback da interrupção */
void ISRcallback() {
/* Indica se uma tarefa de prioridade mais alta foi despertada */
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
/* Desbloqueia a tarefa de processamento da interrupção agora */
/* Cada par representa um ciclo de piscar do LED
O LED pisca 3 vezes*/
cont=0;
xSemaphoreGiveFromISR(xCountingSemaphore, &xHigherPriorityTaskWoken);
}
/* Esta função será chamada quando a tarefa ISRprocessing for criada */
void ISRprocessing(void * parameter) {
Serial.println((char *)parameter);
/* Loop infinito */
while(1){
/* A tarefa entra no estado de bloqueio para esperar pelo evento da interrupção */
xSemaphoreTake(xCountingSemaphore, portMAX_DELAY);
cont++;
Serial.print("ISRprocessing está rodando ");
Serial.println(cont);
/* Alterna o estado do LED */
state = !state;
digitalWrite(ledPin, state);
/* Aguarda um tempo para visualizar o LED piscando */
delay(1000);
}
}
void setup() {
Serial.begin(115200);
pinMode(ledPin, OUTPUT);
/* Define o pino de interrupção como entrada com pull-up interno */
pinMode(interruptPin, INPUT_PULLUP);
/* Anexa a interrupção ao pino
A função ISRcallback será chamada quando a interrupção ocorrer
A interrupção ocorre sempre que há uma borda de subida no pino */
attachInterrupt(digitalPinToInterrupt(interruptPin), ISRcallback, RISING);
/* Inicializa o semáforo de contagem que pode armazenar até 3 eventos */
xCountingSemaphore = xSemaphoreCreateCounting(2, 0);
/* Esta tarefa processará o evento da interrupção,
que foi encaminhado pela função de callback da interrupção */
xTaskCreate(
ISRprocessing, /* Função da tarefa */
"ISRprocessing", /* Nome da tarefa */
1000, /* Tamanho da pilha da tarefa */
NULL, /* Parâmetro da tarefa */
4, /* Prioridade da tarefa */
NULL);
}
void loop() {
delay(10);
}