EventQueue break_dispatch test

Fork of mbed-os-example-mbed5-blinky by mbed-os-examples

main.cpp

Committer:
mapellil
Date:
2018-05-18
Revision:
68:3701a2e4ec3d
Parent:
67:b82d86fdf0ae

File content as of revision 68:3701a2e4ec3d:

#include "mbed.h"

InterruptIn _BlueButton(USER_BUTTON);
DigitalOut  _led1(LED1); 

class myComp {
public:

Thread      _ISRthread;
EventQueue  _ISRqueue;
int         _cnt;
 
void ThreadBodyFunc () {
      printf ("ThreadBodyFunc tid: %x activated\n\r", (unsigned int)_ISRthread.gettid());
    _led1 = !_led1;
    _cnt++;
}
void start() {
      printf ("starting tid: %x ...\n\r", (unsigned int)_ISRthread.gettid());   
    _cnt=0;
   _ISRthread.start(callback(&_ISRqueue, &EventQueue::dispatch_forever));   
   _ISRthread.set_priority(osPriorityRealtime);   // after having called break_dispatch it FAILS with "Thread 00000000 error -4: Parameter error"
   _BlueButton.fall(_ISRqueue.event(this, &myComp::ThreadBodyFunc )); 

}
void stop() {
    printf ("Stopping th...\n\r");  
   _cnt=0;    
   _ISRqueue.break_dispatch();
   _ISRthread.terminate();
   _ISRthread.join();
   printf ("... th joined\n\r"); 
}
};

// main() runs in its own thread in the OS
// pushing the BlueButton 4 times trigger the break_dispatch

int main() {
 myComp comp;   
    printf ("Main started\n\r");
    comp.start(); 
    
    while (1) {
         Thread::yield();
         if (comp._cnt>3) {
            comp.stop();
            Thread::yield();
            comp.start();     
         }
    }   
}