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

siehe auch RTOS-Threads Application Board

Committer:
fpucher
Date:
Tue Mar 28 17:04:53 2017 +0000
Revision:
1:db53d0623808
Parent:
0:15d27adc65b3
Names changed to RGB and some comments added

Who changed what in which revision?

UserRevisionLine numberNew contents of line
fpucher 1:db53d0623808 1 // see: [[RTOS: Demonstration Setup]]
fpucher 0:15d27adc65b3 2 // Trace ab 15:00
fpucher 1:db53d0623808 3 // -->>>>> Löschen Sie die Kommentare bei den entsprechenden Synchronisationsmöglichkeiten (LedMutex, LedSemaphore, Signal)
fpucher 1:db53d0623808 4 // bzw. geben Sie die Kommentare wieder hinein wenn Sie andere testen wollen
fpucher 0:15d27adc65b3 5
fpucher 0:15d27adc65b3 6 #include "mbed.h"
fpucher 0:15d27adc65b3 7
fpucher 0:15d27adc65b3 8 class Rgb
fpucher 0:15d27adc65b3 9 {
fpucher 0:15d27adc65b3 10 private:
fpucher 0:15d27adc65b3 11 DigitalOut _led;
fpucher 1:db53d0623808 12
fpucher 0:15d27adc65b3 13 public:
fpucher 1:db53d0623808 14 Rgb(PinName ld) : _led(ld) {
fpucher 1:db53d0623808 15 _led = 1;
fpucher 1:db53d0623808 16 }; // Constructor with RgbLed = off
fpucher 1:db53d0623808 17
fpucher 0:15d27adc65b3 18 void LedOn() {
fpucher 0:15d27adc65b3 19 _led = 0;
fpucher 0:15d27adc65b3 20 }
fpucher 1:db53d0623808 21 void LedOff() {
fpucher 0:15d27adc65b3 22 _led.write(1);
fpucher 0:15d27adc65b3 23 }
fpucher 1:db53d0623808 24 };
fpucher 0:15d27adc65b3 25
fpucher 0:15d27adc65b3 26 class HasA
fpucher 0:15d27adc65b3 27 {
fpucher 0:15d27adc65b3 28 private:
fpucher 0:15d27adc65b3 29 DigitalOut _led;
fpucher 1:db53d0623808 30
fpucher 0:15d27adc65b3 31 public:
fpucher 0:15d27adc65b3 32 HasA(PinName ld) : _led(ld) {}; // Constructor
fpucher 1:db53d0623808 33
fpucher 0:15d27adc65b3 34 void LedOn() {
fpucher 0:15d27adc65b3 35 _led = 1;
fpucher 0:15d27adc65b3 36 }
fpucher 1:db53d0623808 37 void LedOff() {
fpucher 0:15d27adc65b3 38 _led.write(0);
fpucher 0:15d27adc65b3 39 }
fpucher 1:db53d0623808 40 };
fpucher 0:15d27adc65b3 41
fpucher 0:15d27adc65b3 42 void Delay_Nonsense(uint32_t * DelayCounter, uint32_t const * TargetCount)
fpucher 0:15d27adc65b3 43 {
fpucher 1:db53d0623808 44 while(*DelayCounter <= *TargetCount) {
fpucher 0:15d27adc65b3 45 *DelayCounter = *DelayCounter + 1;
fpucher 0:15d27adc65b3 46 }
fpucher 0:15d27adc65b3 47 *DelayCounter = 0;
fpucher 0:15d27adc65b3 48 }
fpucher 0:15d27adc65b3 49
fpucher 1:db53d0623808 50 //M3: R(p23); G(p24); B(p25);
fpucher 1:db53d0623808 51
fpucher 0:15d27adc65b3 52 HasA Led1(LED1);
fpucher 0:15d27adc65b3 53 HasA Led2(LED2);
fpucher 0:15d27adc65b3 54 HasA Led3(LED3);
fpucher 1:db53d0623808 55
fpucher 1:db53d0623808 56 Rgb LedR(p23);
fpucher 1:db53d0623808 57 Rgb LedG(p24);
fpucher 1:db53d0623808 58 Rgb LedB(p25);
fpucher 0:15d27adc65b3 59
fpucher 0:15d27adc65b3 60 Mutex LedMutex;
fpucher 1:db53d0623808 61 Semaphore LedSemaphore(1);
fpucher 0:15d27adc65b3 62
fpucher 1:db53d0623808 63 //void LedR_Blink(void *pvParameters)
fpucher 1:db53d0623808 64 void LedR_Blink() // red
fpucher 0:15d27adc65b3 65 {
fpucher 1:db53d0623808 66 const int xDelay = 500; // Leuchtdauer
fpucher 1:db53d0623808 67 uint32_t BlueDelay = 0; // zufällige Verzögerung von ...
fpucher 1:db53d0623808 68 const uint32_t TargetCount = 16000; // ... bis
fpucher 0:15d27adc65b3 69
fpucher 1:db53d0623808 70 for(;;) {
fpucher 0:15d27adc65b3 71 // for(int i = 0; i < 10; i++) { // Zufälligkeit
fpucher 0:15d27adc65b3 72 // wait_ms(xDelay);
fpucher 0:15d27adc65b3 73 // }
fpucher 0:15d27adc65b3 74
fpucher 1:db53d0623808 75 // Obtain the Mutex - block for 0 ticks if the semaphore is not
fpucher 1:db53d0623808 76 // immediately available.
fpucher 0:15d27adc65b3 77 // if( xSemaphoreTake( LEDMutex, ( TickType_t ) 10 ) == pdTRUE )
fpucher 1:db53d0623808 78 //LedMutex.lock();
fpucher 1:db53d0623808 79 LedSemaphore.wait();
fpucher 1:db53d0623808 80 //Thread::signal_wait(0x1);
fpucher 1:db53d0623808 81 {
fpucher 1:db53d0623808 82 LedR.LedOn();
fpucher 1:db53d0623808 83 Delay_Nonsense(&BlueDelay, &TargetCount);
fpucher 1:db53d0623808 84 wait_ms(xDelay);
fpucher 1:db53d0623808 85 LedR.LedOff();
fpucher 1:db53d0623808 86 Delay_Nonsense(&BlueDelay, &TargetCount);
fpucher 1:db53d0623808 87 wait_ms(xDelay);
fpucher 1:db53d0623808 88 }
fpucher 0:15d27adc65b3 89 // xSemaphoreGive(LEDMutex);
fpucher 1:db53d0623808 90 //LedMutex.unlock();
fpucher 1:db53d0623808 91 LedSemaphore.release();
fpucher 1:db53d0623808 92 }
fpucher 0:15d27adc65b3 93 }
fpucher 0:15d27adc65b3 94
fpucher 1:db53d0623808 95 void LedG_Blink() // green
fpucher 0:15d27adc65b3 96 {
fpucher 1:db53d0623808 97 const int xDelay = 250;
fpucher 1:db53d0623808 98 uint32_t BlueDelay = 0;
fpucher 1:db53d0623808 99 const uint32_t TargetCount = 16000;
fpucher 0:15d27adc65b3 100
fpucher 1:db53d0623808 101 for(;;) {
fpucher 0:15d27adc65b3 102 // for(int i = 0; i < 10; i++) {
fpucher 0:15d27adc65b3 103 // wait_ms(xDelay);
fpucher 0:15d27adc65b3 104 // }
fpucher 0:15d27adc65b3 105
fpucher 1:db53d0623808 106 // Obtain the Mutex - block for 0 ticks if the semaphore is not
fpucher 1:db53d0623808 107 // immediately available.
fpucher 0:15d27adc65b3 108 // if( xSemaphoreTake( LEDMutex, ( TickType_t ) 10 ) == pdTRUE )
fpucher 0:15d27adc65b3 109 //LedMutex.lock();
fpucher 1:db53d0623808 110 LedSemaphore.wait();
fpucher 0:15d27adc65b3 111 //Thread::signal_wait(0x1);
fpucher 0:15d27adc65b3 112 {
fpucher 1:db53d0623808 113 LedG.LedOn();
fpucher 1:db53d0623808 114 Delay_Nonsense(&BlueDelay, &TargetCount);
fpucher 1:db53d0623808 115 wait_ms(xDelay);
fpucher 1:db53d0623808 116 LedG.LedOff();
fpucher 1:db53d0623808 117 Delay_Nonsense(&BlueDelay, &TargetCount);
fpucher 1:db53d0623808 118 wait_ms(xDelay);
fpucher 0:15d27adc65b3 119 // xSemaphoreGive(LEDMutex);
fpucher 1:db53d0623808 120 }
fpucher 0:15d27adc65b3 121 //LedMutex.unlock();
fpucher 1:db53d0623808 122 LedSemaphore.release();
fpucher 0:15d27adc65b3 123
fpucher 0:15d27adc65b3 124
fpucher 1:db53d0623808 125 }
fpucher 0:15d27adc65b3 126 }
fpucher 0:15d27adc65b3 127
fpucher 1:db53d0623808 128 void LedB_Blink() // blue
fpucher 0:15d27adc65b3 129 {
fpucher 1:db53d0623808 130 const int xDelay = 100;
fpucher 1:db53d0623808 131 uint32_t BlueDelay = 0;
fpucher 1:db53d0623808 132 const uint32_t TargetCount = 16000;
fpucher 0:15d27adc65b3 133
fpucher 1:db53d0623808 134 for(;;) {
fpucher 0:15d27adc65b3 135 // for(int i = 0; i < 10; i++) { // Zufälligkeit
fpucher 0:15d27adc65b3 136 // wait_ms(xDelay);
fpucher 0:15d27adc65b3 137 // }
fpucher 0:15d27adc65b3 138
fpucher 1:db53d0623808 139 // Obtain the Mutex - block for 0 ticks if the semaphore is not
fpucher 1:db53d0623808 140 // immediately available.
fpucher 0:15d27adc65b3 141 // if( xSemaphoreTake( LEDMutex, ( TickType_t ) 10 ) == pdTRUE )
fpucher 1:db53d0623808 142 //LedMutex.lock(); // Led leuchten wird nicht mehr unterbrochen !!!
fpucher 1:db53d0623808 143 LedSemaphore.wait();
fpucher 1:db53d0623808 144 //Thread::signal_wait(0x1);
fpucher 1:db53d0623808 145 {
fpucher 1:db53d0623808 146 LedB.LedOn();
fpucher 1:db53d0623808 147 Delay_Nonsense(&BlueDelay, &TargetCount);
fpucher 1:db53d0623808 148 wait_ms(xDelay+100);
fpucher 1:db53d0623808 149 LedB.LedOff();
fpucher 1:db53d0623808 150 Delay_Nonsense(&BlueDelay, &TargetCount);
fpucher 1:db53d0623808 151 wait_ms(xDelay);
fpucher 0:15d27adc65b3 152 // xSemaphoreGive(LEDMutex);
fpucher 1:db53d0623808 153 }
fpucher 1:db53d0623808 154 //LedMutex.unlock();
fpucher 1:db53d0623808 155 LedSemaphore.release();
fpucher 1:db53d0623808 156 //thread.signal_set(0x1);
fpucher 0:15d27adc65b3 157
fpucher 1:db53d0623808 158 }
fpucher 0:15d27adc65b3 159 }
fpucher 0:15d27adc65b3 160
fpucher 0:15d27adc65b3 161 Thread thread1(osPriorityNormal, DEFAULT_STACK_SIZE, NULL);
fpucher 0:15d27adc65b3 162 //Thread thread1;
fpucher 0:15d27adc65b3 163 Thread thread2;
fpucher 0:15d27adc65b3 164 Thread thread3;
fpucher 0:15d27adc65b3 165
fpucher 1:db53d0623808 166 int main()
fpucher 1:db53d0623808 167 {
fpucher 1:db53d0623808 168 thread1.start(LedR_Blink);
fpucher 1:db53d0623808 169 thread2.start(LedG_Blink);
fpucher 1:db53d0623808 170 thread3.start(LedB_Blink);
fpucher 0:15d27adc65b3 171
fpucher 1:db53d0623808 172 /* Signals
fpucher 1:db53d0623808 173 wait(2);
fpucher 1:db53d0623808 174 thread1.signal_set(0x1);
fpucher 1:db53d0623808 175 wait(2);
fpucher 1:db53d0623808 176 thread2.signal_set(0x1);
fpucher 1:db53d0623808 177 wait(2);
fpucher 1:db53d0623808 178 thread3.signal_set(0x1);
fpucher 1:db53d0623808 179 */
fpucher 0:15d27adc65b3 180 thread1.join();
fpucher 0:15d27adc65b3 181 thread2.join();
fpucher 0:15d27adc65b3 182 thread3.join();
fpucher 0:15d27adc65b3 183 while(1) {
fpucher 1:db53d0623808 184 Led1.LedOn();
fpucher 1:db53d0623808 185 wait(0.5);
fpucher 1:db53d0623808 186 Led1.LedOff();
fpucher 1:db53d0623808 187 wait(0.5);
fpucher 0:15d27adc65b3 188 }
fpucher 0:15d27adc65b3 189 }