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

siehe auch RTOS-Threads Application Board

Committer:
fpucher
Date:
Wed Mar 22 15:35:52 2017 +0000
Revision:
0:15d27adc65b3
Child:
1:db53d0623808
RGB Thread with synchrinization, such as mutex, semaphor and signal.

Who changed what in which revision?

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