This example shows how to use multiple signals from the main thread in mbed-os.
The sample sets up two Tickers to generate periodic interrupts. Each ticker sets a signal during an interrupt.
osSignalWait(signal, timeout) is used to wait for an event. Set signal to 0 to exit on any signal or set signal to a mask value to only exit if all of the signals are set.
Diff: main.cpp
- Revision:
- 0:677614c5f014
- Child:
- 1:907cf114c40c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Thu Sep 08 21:17:19 2016 +0000 @@ -0,0 +1,80 @@ +#include "mbed.h" + +Serial pc(USBTX, USBRX); +Ticker tick1; +Ticker tick2; +DigitalOut led1(LED_RED,true); +DigitalOut led2(LED_GREEN,true); +osThreadId mainThread; + +void interrupt1() +{ + osSignalSet(mainThread, 0x1); +} + +void interrupt2() +{ + osSignalSet(mainThread, 0x2); +} + +int main() +{ + pc.baud(115200); + pc.printf("Init\n\r"); + + // Get the id of the main thread + mainThread = Thread::gettid(); + + tick1.attach(&interrupt1, 1.0); // setup ticker to call interrupt1 every 1.0 seconds + tick2.attach(&interrupt2, 2.0); // setup ticker to call interrupt2 every 1.0 seconds + + while (true) { + // If the event mask is set to 0, then any signal will exit the wait. + // If nothing happens for 10 seonds, timeout + // Internaly the code is doing something like this: + // if (signal1 | signal2) then exit wait + osEvent v = osSignalWait(0, 10000); + pc.printf("Wait1 exit. Status: 0x%x\n",(int) v.status); + + if (v.status == osEventSignal) { + pc.printf("Signals Event1 Caught: 0x%x\n",(int) v.value.signals); + + // Tick1 timeout + if (v.value.signals & 0x1) { + led1 = !led1; + pc.printf("Event1 0x1\n"); + } + + // Tick2 timeout + if (v.value.signals & 0x2) { + led2 = !led2; + pc.printf("Event1 0x2\n"); + } + + } + + // Use this form to wait for both events + // Internaly the code is doing something like this: + // if ((signal1 | signal2) & 0x3 == 0x3) then exit wait + v = osSignalWait(0x3, 10000); + pc.printf("Wait2 exit. Status: 0x%x\n",(int) v.status); + + if (v.status == osEventSignal) { + pc.printf("Signals Event2 Caught: 0x%x\n",(int) v.value.signals); + + // Tick1 timeout + if (v.value.signals & 0x1) { + led1 = !led1; + pc.printf("Event2 0x1\n"); + } + + // Tick2 timeout + if (v.value.signals & 0x2) { + led2 = !led2; + pc.printf("Event2 0x2\n"); + } + + } + + } +} \ No newline at end of file