Example of an interrupt which passes its job as a thread using signals. "With an RTOS application it is best to design the interrupt service code as a thread within the RTOS and assign it a high priority. While it is possible to run C code in an interrupt service routine (ISR), this is not desirable within an RTOS if the interrupt code is going to run for more than a short period of time. This delays the timer tick and disrupts the RTOS kernel. " - “The Designers Guide to the Cortex-M ProcessorFamily” by Trevor Martin

RTOS Example of an RTOS Interrupt as Thread (using signals)

main.cpp

Committer:
Ritzerk
Date:
2019-03-05
Revision:
0:f28b116a2be0

File content as of revision 0:f28b116a2be0:

#include "mbed.h"

InterruptIn button(p14);

Thread ISRthread(osPriorityAboveNormal);
osThreadId ISRthreadId;

DigitalOut myled(LED1);
DigitalOut myled3(LED3);

void newInput();
void ISR_thread();

int main() {
    
   ISRthread.start(callback(ISR_thread));
   button.rise(&newInput);          //interrupt to catch input
   
    while(1) {
        myled = 1;
        osDelay(1000);
        myled = 0;
        osDelay(1000);
    }
}


void newInput() {
    osSignalSet(ISRthreadId,0x01);
}


void ISR_thread() {
    ISRthreadId = osThreadGetId();
    for(;;) {
        osSignalWait(0x01, osWaitForever);
        myled3 = 1;
        osDelay(500);
        myled3 = 0;
    }
}