![](/media/cache/profiles/RDKH0109.JPG.50x50_q85.jpg)
MUTEX_Display
main.cpp@1:98ffcc251be8, 2019-03-21 (annotated)
- Committer:
- corsa1600
- Date:
- Thu Mar 21 18:13:40 2019 +0000
- Revision:
- 1:98ffcc251be8
- Parent:
- 0:ac644277eadb
Mutex
Who changed what in which revision?
User | Revision | Line number | New 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 |