MUTEX_Display

Dependencies:   C12832

Committer:
corsa1600
Date:
Thu Mar 21 18:13:40 2019 +0000
Revision:
1:98ffcc251be8
Parent:
0:ac644277eadb
Mutex

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 0:ac644277eadb 63
corsa1600 0:ac644277eadb 64 //void Led1_Blink(void *pvParameters)
corsa1600 0:ac644277eadb 65 void Led1_Blink() // red long
corsa1600 0:ac644277eadb 66 {
corsa1600 0:ac644277eadb 67 const int xDelay = 500;
corsa1600 0:ac644277eadb 68 uint32_t BlueDelay = 0;
corsa1600 0:ac644277eadb 69 const uint32_t TargetCount = 16000;
corsa1600 0:ac644277eadb 70
corsa1600 0:ac644277eadb 71 for(;;) {
corsa1600 0:ac644277eadb 72 for(int i = 0; i < 10; i++) { // randomnes
corsa1600 0:ac644277eadb 73 wait_ms(xDelay);
corsa1600 0:ac644277eadb 74 }
corsa1600 1:98ffcc251be8 75 // kritischer abschnitt!!! dieser soll mit Mutex behandelt werden
corsa1600 1:98ffcc251be8 76 LCDMutex.lock();// Mutex beginnt
corsa1600 0:ac644277eadb 77 {
corsa1600 0:ac644277eadb 78 lcd.cls();
corsa1600 0:ac644277eadb 79 lcd.locate(0,3);
corsa1600 0:ac644277eadb 80 lcd.printf("Thread 1 RED LED blinks \r\nxxxxxxxx!");
corsa1600 0:ac644277eadb 81
corsa1600 0:ac644277eadb 82 Led1.LedOn();
corsa1600 0:ac644277eadb 83 Delay_Nonsense(&BlueDelay, &TargetCount);
corsa1600 0:ac644277eadb 84 wait_ms(xDelay);
corsa1600 0:ac644277eadb 85 Led1.LedOff();
corsa1600 0:ac644277eadb 86 Delay_Nonsense(&BlueDelay, &TargetCount);
corsa1600 0:ac644277eadb 87 wait_ms(xDelay);
corsa1600 0:ac644277eadb 88 }
corsa1600 1:98ffcc251be8 89 LCDMutex.unlock(); // Mutex endet
corsa1600 0:ac644277eadb 90 }
corsa1600 0:ac644277eadb 91 }
corsa1600 0:ac644277eadb 92
corsa1600 0:ac644277eadb 93 void Led2_Blink() // green
corsa1600 0:ac644277eadb 94 {
corsa1600 0:ac644277eadb 95 const int xDelay = 250;
corsa1600 0:ac644277eadb 96 uint32_t BlueDelay = 0;
corsa1600 0:ac644277eadb 97 const uint32_t TargetCount = 16000;
corsa1600 0:ac644277eadb 98
corsa1600 0:ac644277eadb 99 for(;;) {
corsa1600 0:ac644277eadb 100 for(int i = 0; i < 10; i++) { // randomnes
corsa1600 0:ac644277eadb 101 wait_ms(xDelay);
corsa1600 0:ac644277eadb 102 }
corsa1600 1:98ffcc251be8 103 LCDMutex.lock();// Mutex beginnt
corsa1600 0:ac644277eadb 104 {
corsa1600 0:ac644277eadb 105 lcd.cls();
corsa1600 0:ac644277eadb 106 lcd.locate(0,3);
corsa1600 0:ac644277eadb 107 lcd.printf("Thread 2 GREEN LED blinks \r\nxxxxxxxx!");
corsa1600 0:ac644277eadb 108
corsa1600 0:ac644277eadb 109 Led2.LedOn();
corsa1600 0:ac644277eadb 110 Delay_Nonsense(&BlueDelay, &TargetCount);
corsa1600 0:ac644277eadb 111 wait_ms(xDelay);
corsa1600 0:ac644277eadb 112 Led2.LedOff();
corsa1600 0:ac644277eadb 113 Delay_Nonsense(&BlueDelay, &TargetCount);
corsa1600 0:ac644277eadb 114 wait_ms(xDelay);
corsa1600 0:ac644277eadb 115 }
corsa1600 1:98ffcc251be8 116 LCDMutex.unlock(); // Mutex endet
corsa1600 0:ac644277eadb 117 }
corsa1600 0:ac644277eadb 118 }
corsa1600 0:ac644277eadb 119
corsa1600 0:ac644277eadb 120 void Led3_Blink() // blue very short
corsa1600 0:ac644277eadb 121 {
corsa1600 0:ac644277eadb 122 const int xDelay = 100;
corsa1600 0:ac644277eadb 123 uint32_t BlueDelay = 0;
corsa1600 0:ac644277eadb 124 const uint32_t TargetCount = 16000;
corsa1600 0:ac644277eadb 125
corsa1600 0:ac644277eadb 126 for(;;) {
corsa1600 0:ac644277eadb 127 for(int i = 0; i < 10; i++) { // randomnes
corsa1600 0:ac644277eadb 128 wait_ms(xDelay);
corsa1600 0:ac644277eadb 129 }
corsa1600 1:98ffcc251be8 130 LCDMutex.lock();// Mutex beginnt
corsa1600 0:ac644277eadb 131 {
corsa1600 0:ac644277eadb 132 lcd.cls();
corsa1600 0:ac644277eadb 133 lcd.locate(0,3);
corsa1600 0:ac644277eadb 134 lcd.printf("Thread 3 BLUE LED blinks \r\nxxxxxxxx!");
corsa1600 0:ac644277eadb 135
corsa1600 0:ac644277eadb 136
corsa1600 0:ac644277eadb 137 Led3.LedOn();
corsa1600 0:ac644277eadb 138 Delay_Nonsense(&BlueDelay, &TargetCount);
corsa1600 0:ac644277eadb 139 wait_ms(xDelay);
corsa1600 0:ac644277eadb 140 Led3.LedOff();
corsa1600 0:ac644277eadb 141 Delay_Nonsense(&BlueDelay, &TargetCount);
corsa1600 0:ac644277eadb 142 wait_ms(xDelay);
corsa1600 0:ac644277eadb 143 }
corsa1600 1:98ffcc251be8 144 LCDMutex.unlock(); // Mutex endet
corsa1600 0:ac644277eadb 145 }
corsa1600 0:ac644277eadb 146 }
corsa1600 0:ac644277eadb 147
corsa1600 0:ac644277eadb 148 DigitalOut Led4(LED4);
corsa1600 0:ac644277eadb 149 volatile bool running = true;
corsa1600 0:ac644277eadb 150
corsa1600 0:ac644277eadb 151 // Callback function to pass arguments to params
corsa1600 0:ac644277eadb 152 void blink(DigitalOut *led) {
corsa1600 0:ac644277eadb 153 osThreadSetPriority(osThreadGetId(), osPriorityIdle);
corsa1600 0:ac644277eadb 154 while (running) {
corsa1600 0:ac644277eadb 155 *led = !*led;
corsa1600 0:ac644277eadb 156 wait(1);
corsa1600 0:ac644277eadb 157 }
corsa1600 0:ac644277eadb 158 }
corsa1600 0:ac644277eadb 159
corsa1600 0:ac644277eadb 160 // https://docs.mbed.com/docs/mbed-os-api-reference/en/latest/APIs/tasks/rtos/#thread
corsa1600 0:ac644277eadb 161
corsa1600 0:ac644277eadb 162 Thread thread1;//(osPriorityNormal, 400, NULL); //DEFAULT_STACK_SIZE, NULL); die default stack size funktioniert manchmal nicht laut Hr. Pucher
corsa1600 0:ac644277eadb 163 // Thread thread1;
corsa1600 0:ac644277eadb 164 Thread thread2;
corsa1600 0:ac644277eadb 165 Thread thread3;
corsa1600 0:ac644277eadb 166 // parametrisierter Thread
corsa1600 0:ac644277eadb 167 Thread pthread; //(osPriorityHigh, 400, NULL);//DEFAULT_STACK_SIZE, NULL);
corsa1600 0:ac644277eadb 168
corsa1600 0:ac644277eadb 169 int main() {
corsa1600 0:ac644277eadb 170 thread1.start(Led1_Blink);
corsa1600 0:ac644277eadb 171 thread2.start(Led2_Blink);
corsa1600 0:ac644277eadb 172 thread3.start(Led3_Blink);
corsa1600 0:ac644277eadb 173 // Start parametrisierter Thread mit Callback Funktion
corsa1600 0:ac644277eadb 174 pthread.start(callback(blink, &Led4));
corsa1600 0:ac644277eadb 175
corsa1600 0:ac644277eadb 176 osThreadSetPriority(osThreadGetId(), osPriorityIdle); // osPriorityHigh,
corsa1600 0:ac644277eadb 177 // osPriorityIdle
corsa1600 0:ac644277eadb 178 Thread::yield();
corsa1600 0:ac644277eadb 179 printf("Priority is %i\r\n", thread1.get_priority());
corsa1600 0:ac644277eadb 180 Thread::wait(1);
corsa1600 0:ac644277eadb 181
corsa1600 0:ac644277eadb 182 thread1.join();
corsa1600 0:ac644277eadb 183 thread2.join();
corsa1600 0:ac644277eadb 184 thread3.join();
corsa1600 0:ac644277eadb 185
corsa1600 0:ac644277eadb 186 while(1) {
corsa1600 0:ac644277eadb 187 }
corsa1600 0:ac644277eadb 188 thread1.terminate();
corsa1600 0:ac644277eadb 189 }
corsa1600 0:ac644277eadb 190
corsa1600 0:ac644277eadb 191