Semaphore_Display

Dependencies:   C12832

Committer:
corsa1600
Date:
Thu Mar 21 18:20:01 2019 +0000
Revision:
2:9a1b2edd0b0d
Parent:
1:98ffcc251be8
Semaphore

Who changed what in which revision?

UserRevisionLine numberNew contents of line
corsa1600 0:ac644277eadb 1 // see: [[RTOS: Demonstration Setup]]
corsa1600 0:ac644277eadb 2 // Trace ab 15:00
corsa1600 0:ac644277eadb 3
corsa1600 0:ac644277eadb 4 #include "mbed.h"
corsa1600 0:ac644277eadb 5 #include "C12832.h"
corsa1600 0:ac644277eadb 6
corsa1600 0:ac644277eadb 7 C12832 lcd (p5, p7, p6, p8, p11);
corsa1600 0:ac644277eadb 8
corsa1600 0:ac644277eadb 9 class Rgb
corsa1600 0:ac644277eadb 10 {
corsa1600 0:ac644277eadb 11 private:
corsa1600 0:ac644277eadb 12 DigitalOut _led;
corsa1600 0:ac644277eadb 13
corsa1600 0:ac644277eadb 14 public:
corsa1600 0:ac644277eadb 15 Rgb(PinName ld) : _led(ld) { _led = 1;}; // Constructor
corsa1600 0:ac644277eadb 16
corsa1600 0:ac644277eadb 17 void LedOn() {
corsa1600 0:ac644277eadb 18 _led = 0;
corsa1600 0:ac644277eadb 19 }
corsa1600 0:ac644277eadb 20 void LedOff(){
corsa1600 0:ac644277eadb 21 _led.write(1);
corsa1600 0:ac644277eadb 22 }
corsa1600 0:ac644277eadb 23 };
corsa1600 0:ac644277eadb 24
corsa1600 0:ac644277eadb 25 class HasA
corsa1600 0:ac644277eadb 26 {
corsa1600 0:ac644277eadb 27 private:
corsa1600 0:ac644277eadb 28 DigitalOut _led;
corsa1600 0:ac644277eadb 29
corsa1600 0:ac644277eadb 30 public:
corsa1600 0:ac644277eadb 31 HasA(PinName ld) : _led(ld) {}; // Constructor
corsa1600 0:ac644277eadb 32
corsa1600 0:ac644277eadb 33 void LedOn() {
corsa1600 0:ac644277eadb 34 _led = 1;
corsa1600 0:ac644277eadb 35 }
corsa1600 0:ac644277eadb 36 void LedOff(){
corsa1600 0:ac644277eadb 37 _led.write(0);
corsa1600 0:ac644277eadb 38 }
corsa1600 0:ac644277eadb 39 };
corsa1600 0:ac644277eadb 40
corsa1600 0:ac644277eadb 41 void Delay_Nonsense(uint32_t * DelayCounter, uint32_t const * TargetCount)
corsa1600 0:ac644277eadb 42 {
corsa1600 0:ac644277eadb 43 while(*DelayCounter <= *TargetCount)
corsa1600 0:ac644277eadb 44 {
corsa1600 0:ac644277eadb 45 *DelayCounter = *DelayCounter + 1;
corsa1600 0:ac644277eadb 46 }
corsa1600 0:ac644277eadb 47
corsa1600 0:ac644277eadb 48 *DelayCounter = 0;
corsa1600 0:ac644277eadb 49 }
corsa1600 0:ac644277eadb 50
corsa1600 0:ac644277eadb 51 //M3 r (p23); g (p24); b (p25);
corsa1600 0:ac644277eadb 52 /*
corsa1600 0:ac644277eadb 53 HasA Led1(LED1);
corsa1600 0:ac644277eadb 54 HasA Led2(LED2);
corsa1600 0:ac644277eadb 55 HasA Led3(LED3);
corsa1600 0:ac644277eadb 56 */
corsa1600 0:ac644277eadb 57 Rgb Led1(p23);
corsa1600 0:ac644277eadb 58 Rgb Led2(p24);
corsa1600 0:ac644277eadb 59 Rgb Led3(p25);
corsa1600 1:98ffcc251be8 60
corsa1600 1:98ffcc251be8 61
corsa1600 1:98ffcc251be8 62 Mutex LCDMutex; // hier wird der Mutex instanziiert
corsa1600 2:9a1b2edd0b0d 63 Semaphore one_slot(3);// die Anzahl der gleichzeitig erlaubten Threads bei 1 darf immer nur einer hier bei 3 haben wir wieder das Problem das alles gleichzeitig losgehen kann
corsa1600 0:ac644277eadb 64
corsa1600 0:ac644277eadb 65 //void Led1_Blink(void *pvParameters)
corsa1600 0:ac644277eadb 66 void Led1_Blink() // red long
corsa1600 0:ac644277eadb 67 {
corsa1600 0:ac644277eadb 68 const int xDelay = 500;
corsa1600 0:ac644277eadb 69 uint32_t BlueDelay = 0;
corsa1600 0:ac644277eadb 70 const uint32_t TargetCount = 16000;
corsa1600 0:ac644277eadb 71
corsa1600 0:ac644277eadb 72 for(;;) {
corsa1600 0:ac644277eadb 73 for(int i = 0; i < 10; i++) { // randomnes
corsa1600 0:ac644277eadb 74 wait_ms(xDelay);
corsa1600 0:ac644277eadb 75 }
corsa1600 1:98ffcc251be8 76 // kritischer abschnitt!!! dieser soll mit Mutex behandelt werden
corsa1600 2:9a1b2edd0b0d 77 //LCDMutex.lock();// Mutex beginnt
corsa1600 2:9a1b2edd0b0d 78 one_slot.wait();
corsa1600 0:ac644277eadb 79 {
corsa1600 0:ac644277eadb 80 lcd.cls();
corsa1600 0:ac644277eadb 81 lcd.locate(0,3);
corsa1600 0:ac644277eadb 82 lcd.printf("Thread 1 RED LED blinks \r\nxxxxxxxx!");
corsa1600 0:ac644277eadb 83
corsa1600 0:ac644277eadb 84 Led1.LedOn();
corsa1600 0:ac644277eadb 85 Delay_Nonsense(&BlueDelay, &TargetCount);
corsa1600 0:ac644277eadb 86 wait_ms(xDelay);
corsa1600 0:ac644277eadb 87 Led1.LedOff();
corsa1600 0:ac644277eadb 88 Delay_Nonsense(&BlueDelay, &TargetCount);
corsa1600 0:ac644277eadb 89 wait_ms(xDelay);
corsa1600 0:ac644277eadb 90 }
corsa1600 2:9a1b2edd0b0d 91 //LCDMutex.unlock(); // Mutex endet
corsa1600 2:9a1b2edd0b0d 92 one_slot.release();
corsa1600 0:ac644277eadb 93 }
corsa1600 0:ac644277eadb 94 }
corsa1600 0:ac644277eadb 95
corsa1600 0:ac644277eadb 96 void Led2_Blink() // green
corsa1600 0:ac644277eadb 97 {
corsa1600 0:ac644277eadb 98 const int xDelay = 250;
corsa1600 0:ac644277eadb 99 uint32_t BlueDelay = 0;
corsa1600 0:ac644277eadb 100 const uint32_t TargetCount = 16000;
corsa1600 0:ac644277eadb 101
corsa1600 0:ac644277eadb 102 for(;;) {
corsa1600 0:ac644277eadb 103 for(int i = 0; i < 10; i++) { // randomnes
corsa1600 0:ac644277eadb 104 wait_ms(xDelay);
corsa1600 0:ac644277eadb 105 }
corsa1600 2:9a1b2edd0b0d 106 //LCDMutex.lock();// Mutex beginnt
corsa1600 2:9a1b2edd0b0d 107 one_slot.wait();
corsa1600 0:ac644277eadb 108 {
corsa1600 0:ac644277eadb 109 lcd.cls();
corsa1600 0:ac644277eadb 110 lcd.locate(0,3);
corsa1600 0:ac644277eadb 111 lcd.printf("Thread 2 GREEN LED blinks \r\nxxxxxxxx!");
corsa1600 0:ac644277eadb 112
corsa1600 0:ac644277eadb 113 Led2.LedOn();
corsa1600 0:ac644277eadb 114 Delay_Nonsense(&BlueDelay, &TargetCount);
corsa1600 0:ac644277eadb 115 wait_ms(xDelay);
corsa1600 0:ac644277eadb 116 Led2.LedOff();
corsa1600 0:ac644277eadb 117 Delay_Nonsense(&BlueDelay, &TargetCount);
corsa1600 0:ac644277eadb 118 wait_ms(xDelay);
corsa1600 0:ac644277eadb 119 }
corsa1600 2:9a1b2edd0b0d 120 //LCDMutex.unlock(); // Mutex endet
corsa1600 2:9a1b2edd0b0d 121 one_slot.release();
corsa1600 0:ac644277eadb 122 }
corsa1600 0:ac644277eadb 123 }
corsa1600 0:ac644277eadb 124
corsa1600 0:ac644277eadb 125 void Led3_Blink() // blue very short
corsa1600 0:ac644277eadb 126 {
corsa1600 0:ac644277eadb 127 const int xDelay = 100;
corsa1600 0:ac644277eadb 128 uint32_t BlueDelay = 0;
corsa1600 0:ac644277eadb 129 const uint32_t TargetCount = 16000;
corsa1600 0:ac644277eadb 130
corsa1600 0:ac644277eadb 131 for(;;) {
corsa1600 0:ac644277eadb 132 for(int i = 0; i < 10; i++) { // randomnes
corsa1600 0:ac644277eadb 133 wait_ms(xDelay);
corsa1600 0:ac644277eadb 134 }
corsa1600 2:9a1b2edd0b0d 135 //LCDMutex.lock();// Mutex beginnt
corsa1600 2:9a1b2edd0b0d 136 one_slot.wait();
corsa1600 0:ac644277eadb 137 {
corsa1600 0:ac644277eadb 138 lcd.cls();
corsa1600 0:ac644277eadb 139 lcd.locate(0,3);
corsa1600 0:ac644277eadb 140 lcd.printf("Thread 3 BLUE LED blinks \r\nxxxxxxxx!");
corsa1600 0:ac644277eadb 141
corsa1600 0:ac644277eadb 142
corsa1600 0:ac644277eadb 143 Led3.LedOn();
corsa1600 0:ac644277eadb 144 Delay_Nonsense(&BlueDelay, &TargetCount);
corsa1600 0:ac644277eadb 145 wait_ms(xDelay);
corsa1600 0:ac644277eadb 146 Led3.LedOff();
corsa1600 0:ac644277eadb 147 Delay_Nonsense(&BlueDelay, &TargetCount);
corsa1600 0:ac644277eadb 148 wait_ms(xDelay);
corsa1600 0:ac644277eadb 149 }
corsa1600 2:9a1b2edd0b0d 150 //LCDMutex.unlock(); // Mutex endet
corsa1600 2:9a1b2edd0b0d 151 one_slot.release();
corsa1600 0:ac644277eadb 152 }
corsa1600 0:ac644277eadb 153 }
corsa1600 0:ac644277eadb 154
corsa1600 0:ac644277eadb 155 DigitalOut Led4(LED4);
corsa1600 0:ac644277eadb 156 volatile bool running = true;
corsa1600 0:ac644277eadb 157
corsa1600 0:ac644277eadb 158 // Callback function to pass arguments to params
corsa1600 0:ac644277eadb 159 void blink(DigitalOut *led) {
corsa1600 0:ac644277eadb 160 osThreadSetPriority(osThreadGetId(), osPriorityIdle);
corsa1600 0:ac644277eadb 161 while (running) {
corsa1600 0:ac644277eadb 162 *led = !*led;
corsa1600 0:ac644277eadb 163 wait(1);
corsa1600 0:ac644277eadb 164 }
corsa1600 0:ac644277eadb 165 }
corsa1600 0:ac644277eadb 166
corsa1600 0:ac644277eadb 167 // https://docs.mbed.com/docs/mbed-os-api-reference/en/latest/APIs/tasks/rtos/#thread
corsa1600 0:ac644277eadb 168
corsa1600 0:ac644277eadb 169 Thread thread1;//(osPriorityNormal, 400, NULL); //DEFAULT_STACK_SIZE, NULL); die default stack size funktioniert manchmal nicht laut Hr. Pucher
corsa1600 0:ac644277eadb 170 // Thread thread1;
corsa1600 0:ac644277eadb 171 Thread thread2;
corsa1600 0:ac644277eadb 172 Thread thread3;
corsa1600 0:ac644277eadb 173 // parametrisierter Thread
corsa1600 0:ac644277eadb 174 Thread pthread; //(osPriorityHigh, 400, NULL);//DEFAULT_STACK_SIZE, NULL);
corsa1600 0:ac644277eadb 175
corsa1600 0:ac644277eadb 176 int main() {
corsa1600 0:ac644277eadb 177 thread1.start(Led1_Blink);
corsa1600 0:ac644277eadb 178 thread2.start(Led2_Blink);
corsa1600 0:ac644277eadb 179 thread3.start(Led3_Blink);
corsa1600 0:ac644277eadb 180 // Start parametrisierter Thread mit Callback Funktion
corsa1600 0:ac644277eadb 181 pthread.start(callback(blink, &Led4));
corsa1600 0:ac644277eadb 182
corsa1600 0:ac644277eadb 183 osThreadSetPriority(osThreadGetId(), osPriorityIdle); // osPriorityHigh,
corsa1600 0:ac644277eadb 184 // osPriorityIdle
corsa1600 0:ac644277eadb 185 Thread::yield();
corsa1600 0:ac644277eadb 186 printf("Priority is %i\r\n", thread1.get_priority());
corsa1600 0:ac644277eadb 187 Thread::wait(1);
corsa1600 0:ac644277eadb 188
corsa1600 0:ac644277eadb 189 thread1.join();
corsa1600 0:ac644277eadb 190 thread2.join();
corsa1600 0:ac644277eadb 191 thread3.join();
corsa1600 0:ac644277eadb 192
corsa1600 0:ac644277eadb 193 while(1) {
corsa1600 0:ac644277eadb 194 }
corsa1600 0:ac644277eadb 195 thread1.terminate();
corsa1600 0:ac644277eadb 196 }
corsa1600 0:ac644277eadb 197
corsa1600 0:ac644277eadb 198