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)

Committer:
Ritzerk
Date:
Tue Mar 05 12:16:33 2019 +0000
Revision:
0:f28b116a2be0
RTOS Interrupt as Thread

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Ritzerk 0:f28b116a2be0 1 #include "mbed.h"
Ritzerk 0:f28b116a2be0 2
Ritzerk 0:f28b116a2be0 3 InterruptIn button(p14);
Ritzerk 0:f28b116a2be0 4
Ritzerk 0:f28b116a2be0 5 Thread ISRthread(osPriorityAboveNormal);
Ritzerk 0:f28b116a2be0 6 osThreadId ISRthreadId;
Ritzerk 0:f28b116a2be0 7
Ritzerk 0:f28b116a2be0 8 DigitalOut myled(LED1);
Ritzerk 0:f28b116a2be0 9 DigitalOut myled3(LED3);
Ritzerk 0:f28b116a2be0 10
Ritzerk 0:f28b116a2be0 11 void newInput();
Ritzerk 0:f28b116a2be0 12 void ISR_thread();
Ritzerk 0:f28b116a2be0 13
Ritzerk 0:f28b116a2be0 14 int main() {
Ritzerk 0:f28b116a2be0 15
Ritzerk 0:f28b116a2be0 16 ISRthread.start(callback(ISR_thread));
Ritzerk 0:f28b116a2be0 17 button.rise(&newInput); //interrupt to catch input
Ritzerk 0:f28b116a2be0 18
Ritzerk 0:f28b116a2be0 19 while(1) {
Ritzerk 0:f28b116a2be0 20 myled = 1;
Ritzerk 0:f28b116a2be0 21 osDelay(1000);
Ritzerk 0:f28b116a2be0 22 myled = 0;
Ritzerk 0:f28b116a2be0 23 osDelay(1000);
Ritzerk 0:f28b116a2be0 24 }
Ritzerk 0:f28b116a2be0 25 }
Ritzerk 0:f28b116a2be0 26
Ritzerk 0:f28b116a2be0 27
Ritzerk 0:f28b116a2be0 28 void newInput() {
Ritzerk 0:f28b116a2be0 29 osSignalSet(ISRthreadId,0x01);
Ritzerk 0:f28b116a2be0 30 }
Ritzerk 0:f28b116a2be0 31
Ritzerk 0:f28b116a2be0 32
Ritzerk 0:f28b116a2be0 33 void ISR_thread() {
Ritzerk 0:f28b116a2be0 34 ISRthreadId = osThreadGetId();
Ritzerk 0:f28b116a2be0 35 for(;;) {
Ritzerk 0:f28b116a2be0 36 osSignalWait(0x01, osWaitForever);
Ritzerk 0:f28b116a2be0 37 myled3 = 1;
Ritzerk 0:f28b116a2be0 38 osDelay(500);
Ritzerk 0:f28b116a2be0 39 myled3 = 0;
Ritzerk 0:f28b116a2be0 40 }
Ritzerk 0:f28b116a2be0 41 }