RGB Thread with synchrinization, such as mutex, semaphore and signal.

siehe auch RTOS-Threads Application Board

main.cpp

Committer:
fpucher
Date:
2017-03-22
Revision:
0:15d27adc65b3
Child:
1:db53d0623808

File content as of revision 0:15d27adc65b3:

// see: [[RTOS: Demonstration Setup]] 
// Trace ab 15:00

#include "mbed.h"

class Rgb
{
private:
    DigitalOut _led;
 
public:
    Rgb(PinName ld) : _led(ld) { _led = 1; };  // Constructor with RgbLed = off
    
    void LedOn() {
        _led = 0;
    }
    void LedOff(){
        _led.write(1);
    }
};  

class HasA
{
private:
    DigitalOut _led;
 
public:
    HasA(PinName ld) : _led(ld) {};  // Constructor
    
    void LedOn() {
        _led = 1;
    }
    void LedOff(){
        _led.write(0);
    }
};  

void Delay_Nonsense(uint32_t * DelayCounter, uint32_t const * TargetCount)
{
    while(*DelayCounter <= *TargetCount)
    {
        *DelayCounter = *DelayCounter + 1;
    }
    *DelayCounter = 0;
}

//M3 r (p23); g (p24); b (p25);
/*
HasA Led1(LED1);
HasA Led2(LED2);
HasA Led3(LED3);
*/
Rgb Led1(p23);
Rgb Led2(p24);
Rgb Led3(p25);

Mutex LedMutex;
Semaphore LedSemaphore(3);

//void Led1_Blink(void *pvParameters)
void Led1_Blink()   // red
{
   const int xDelay = 500;                  // Leuchtdauer
   uint32_t BlueDelay = 0;                  // zufällige Verzögerung von ...
   const uint32_t TargetCount = 16000;      // ... bis

   for(;;) {
//       for(int i = 0; i < 10; i++) {      // Zufälligkeit
//          wait_ms(xDelay);
//       }

       // Obtain the Mutex - block for 0 ticks if the semaphore is not
       // immediately available.
//       if( xSemaphoreTake( LEDMutex, ( TickType_t ) 10 ) == pdTRUE )
       //LedMutex.lock();
       //LedSemaphore.wait();
       //Thread::signal_wait(0x1);
       {
           Led1.LedOn();
           Delay_Nonsense(&BlueDelay, &TargetCount);
           wait_ms(xDelay);
           Led1.LedOff();
           Delay_Nonsense(&BlueDelay, &TargetCount);
           wait_ms(xDelay);
       }
//     xSemaphoreGive(LEDMutex);
       //LedMutex.unlock();
       //LedSemaphore.release();
   }
}

void Led2_Blink()   // green
{
   const int xDelay = 250; 
   uint32_t BlueDelay = 0;
   const uint32_t TargetCount = 16000;

   for(;;) {
//       for(int i = 0; i < 10; i++) {
//          wait_ms(xDelay);
//       }

       // Obtain the Mutex - block for 0 ticks if the semaphore is not
       // immediately available.
//       if( xSemaphoreTake( LEDMutex, ( TickType_t ) 10 ) == pdTRUE )
        //LedMutex.lock();
        //LedSemaphore.wait();
        //Thread::signal_wait(0x1);
        {
           Led2.LedOn();
           Delay_Nonsense(&BlueDelay, &TargetCount);
           wait_ms(xDelay);
           Led2.LedOff();
           Delay_Nonsense(&BlueDelay, &TargetCount);
           wait_ms(xDelay);
//           xSemaphoreGive(LEDMutex);
        }  
        //LedMutex.unlock();
        //LedSemaphore.release();


   }
}

void Led3_Blink()   // blue
{
   const int xDelay = 100; 
   uint32_t BlueDelay = 0;
   const uint32_t TargetCount = 16000;

   for(;;) {
//       for(int i = 0; i < 10; i++) {      // Zufälligkeit
//          wait_ms(xDelay);
//       }

       // Obtain the Mutex - block for 0 ticks if the semaphore is not
       // immediately available.
//       if( xSemaphoreTake( LEDMutex, ( TickType_t ) 10 ) == pdTRUE )
       //LedMutex.lock();                // Led leuchten wird nicht mehr unterbrochen !!!
       //LedSemaphore.wait();
       //Thread::signal_wait(0x1);
       {
           Led3.LedOn();
           Delay_Nonsense(&BlueDelay, &TargetCount);
           wait_ms(xDelay+100);
           Led3.LedOff();
           Delay_Nonsense(&BlueDelay, &TargetCount);
           wait_ms(xDelay);
//           xSemaphoreGive(LEDMutex);
       }
       //LedMutex.unlock();
       //LedSemaphore.release();
       //thread.signal_set(0x1);

   }
}

Thread thread1(osPriorityNormal, DEFAULT_STACK_SIZE, NULL);
//Thread thread1;
Thread thread2;
Thread thread3;

int main() {
    thread1.start(Led1_Blink);
    thread2.start(Led2_Blink);
    thread3.start(Led3_Blink);

/* Signals
    wait(2);
    thread1.signal_set(0x1);
    wait(2);
    thread2.signal_set(0x1);
    wait(2);
    thread3.signal_set(0x1);
*/   
    thread1.join();
    thread2.join();
    thread3.join();
    while(1) {
    }
}