Important changes to forums and questions
All forums and questions are now archived. To start a new conversation or read the latest updates go to forums.mbed.com.
9 years, 11 months ago.
wait for interrupt in a non-main thread possible?
The project I am working on will have two thread: 1) the main thread does all the routine work; 2) another thread does nothing most of the time but needs to be activated by certain events such as pressing a key on keypad, run for a few minutes or so then goes back to inactive. In principal I think this is possible but I could not figure out a way to do it.
I first tried _wfi(). That seems put the whole MCU into sleep.
I then tried thread:signal()_set & signal_wait(), it didn't work either.
Edit: the code was updated according to Erik's suggestion and it worked.
include the mbed library with this snippet
#include "mbed.h" #include "rtos.h" DigitalOut myled(LED1); Ticker myticker; osThreadId mythreadID; void flipper(void const *args) { mythreadID = Thread::gettid(); while(1) { Thread::signal_wait(0x1); myled = !myled; } } void _isr( ) { osSignalSet(mythreadID, 0x1); } int main() { myticker.attach(&_isr, 1); Thread mythread(flipper); while (1) { //do routine here } }
Could someone lend me a hand on this? Thanks in advance.
1 Answer
9 years, 11 months ago.
Signal set/wait is the way to go. You can make the thread in main, and only have a global pointer to the thread. I actually am not sure if you are allowed to make a global thread, never done that myself.
I have done this in for example: http://developer.mbed.org/users/Sissors/code/SimpleDMA/file/d3be727fa9d2/SimpleDMA.h (see the parts within #ifdef RTOS_H). Only there it is slightly different since I can get the thread ID, but not a pointer to the thread. So I use a CMSIS-RTOS function which does the same.