/* * Example of a Arduino interruption and RTOS Binary Semaphore * https://www.freertos.org/Embedded-RTOS-Binary-Semaphores.html */ // Include Arduino FreeRTOS library #include // Include semaphore supoport #include /* * Declaring a global variable of type SemaphoreHandle_t * */ SemaphoreHandle_t interruptSemaphore; // set interrupt pin #ifdef BTN_BUILTIN uint8_t int_pin = BTN_BUILTIN; #elif defined(ARDUINO_ELSOMIK) uint8_t int_pin = P0_8; #else uint8_t int_pin = 2; #endif // set led pin #ifdef LED_BUILTIN uint8_t blink_pin = LED_BUILTIN; #elif defined(ARDUINO_ELSOMIK) uint8_t blink_pin = P0_0; #else uint8_t blink_pin = 3; #endif void setup() { // Create task for Arduino led xTaskCreate(TaskLed, // Task function "Led", // Task name 128, // Stack size NULL, 0, // Priority NULL ); /** * Create a binary semaphore. * https://www.freertos.org/xSemaphoreCreateBinary.html */ interruptSemaphore = xSemaphoreCreateBinary(); if (interruptSemaphore != NULL) { // Attach interrupt for Arduino digital pin attachInterrupt(digitalPinToInterrupt(int_pin), interruptHandler, RISING); } } void loop() {} void interruptHandler() { /** * Give semaphore in the interrupt handler * https://www.freertos.org/a00124.html */ xSemaphoreGiveFromISR(interruptSemaphore, NULL); } /* * Led task. */ void TaskLed(void *pvParameters) { (void) pvParameters; pinMode(blink_pin, OUTPUT); for (;;) { /** * Take the semaphore. * https://www.freertos.org/a00122.html */ if (xSemaphoreTake(interruptSemaphore, portMAX_DELAY) == pdPASS) { digitalWrite(blink_pin, !digitalRead(blink_pin)); } vTaskDelay(10); } }