1) lcd must wait 2) assign high priority to lcd 3) check malloc return code 4) printf clean
Dependencies: C12832_lcd LM75B mbed-rtos mbed
Fork of MHey_HW6_1 by
HW6_1_IPC.cpp@1:52291f3a1895, 2014-03-12 (annotated)
- Committer:
- avnisha
- Date:
- Wed Mar 12 20:51:16 2014 +0000
- Revision:
- 1:52291f3a1895
- Parent:
- 0:337ae54a3bdb
ok
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Michael_embed1 | 0:337ae54a3bdb | 1 | #include "mbed.h" |
Michael_embed1 | 0:337ae54a3bdb | 2 | #include "LM75B.h" |
Michael_embed1 | 0:337ae54a3bdb | 3 | #include "C12832_lcd.h" |
Michael_embed1 | 0:337ae54a3bdb | 4 | #include "rtos.h" |
Michael_embed1 | 0:337ae54a3bdb | 5 | |
Michael_embed1 | 0:337ae54a3bdb | 6 | // instantiate hardware peripherals |
Michael_embed1 | 0:337ae54a3bdb | 7 | LM75B tmpSns(p28,p27); |
Michael_embed1 | 0:337ae54a3bdb | 8 | C12832_LCD lcd; |
Michael_embed1 | 0:337ae54a3bdb | 9 | Serial pc(USBTX, USBRX); // tx, rx; used only if errors encountered |
Michael_embed1 | 0:337ae54a3bdb | 10 | |
Michael_embed1 | 0:337ae54a3bdb | 11 | // mutex to make the lcd lib thread safe |
Michael_embed1 | 0:337ae54a3bdb | 12 | Mutex lcd_mutex; |
Michael_embed1 | 0:337ae54a3bdb | 13 | |
Michael_embed1 | 0:337ae54a3bdb | 14 | AnalogIn Pot1(p19); |
Michael_embed1 | 0:337ae54a3bdb | 15 | |
Michael_embed1 | 0:337ae54a3bdb | 16 | typedef unsigned short potVal_t; |
Michael_embed1 | 0:337ae54a3bdb | 17 | typedef float tempVal_t; |
Michael_embed1 | 0:337ae54a3bdb | 18 | |
Michael_embed1 | 0:337ae54a3bdb | 19 | //Potentiometer values memory pool |
Michael_embed1 | 0:337ae54a3bdb | 20 | MemoryPool<potVal_t, 16> potVal_mpool; |
Michael_embed1 | 0:337ae54a3bdb | 21 | Queue<potVal_t, 16> potVal_queue; |
Michael_embed1 | 0:337ae54a3bdb | 22 | |
Michael_embed1 | 0:337ae54a3bdb | 23 | //Temperature sensor values memory pool |
Michael_embed1 | 0:337ae54a3bdb | 24 | MemoryPool<tempVal_t, 16> tempVal_mpool; |
Michael_embed1 | 0:337ae54a3bdb | 25 | Queue<tempVal_t, 16> tempVal_queue; |
Michael_embed1 | 0:337ae54a3bdb | 26 | |
Michael_embed1 | 0:337ae54a3bdb | 27 | |
Michael_embed1 | 0:337ae54a3bdb | 28 | // Thread potVal_send_thread() |
Michael_embed1 | 0:337ae54a3bdb | 29 | // Pot1 sends value to LCD thread via IPC Queue |
Michael_embed1 | 0:337ae54a3bdb | 30 | void potVal_send_thread(void const *args) |
Michael_embed1 | 0:337ae54a3bdb | 31 | { |
Michael_embed1 | 0:337ae54a3bdb | 32 | potVal_t *potValMessage; |
Michael_embed1 | 0:337ae54a3bdb | 33 | |
Michael_embed1 | 0:337ae54a3bdb | 34 | while(true) |
Michael_embed1 | 0:337ae54a3bdb | 35 | { |
Michael_embed1 | 0:337ae54a3bdb | 36 | // potVal_t *potValMessage = potVal_mpool.alloc(); |
Michael_embed1 | 0:337ae54a3bdb | 37 | potValMessage = potVal_mpool.alloc(); |
avnisha | 1:52291f3a1895 | 38 | if (potValMessage == NULL) { |
avnisha | 1:52291f3a1895 | 39 | pc.printf("****\n\r"); |
avnisha | 1:52291f3a1895 | 40 | continue; |
avnisha | 1:52291f3a1895 | 41 | } |
Michael_embed1 | 0:337ae54a3bdb | 42 | *potValMessage = Pot1.read_u16(); // get Pot1 value |
avnisha | 1:52291f3a1895 | 43 | potVal_queue.put(potValMessage, 1000); // put it in the queue |
avnisha | 1:52291f3a1895 | 44 | Thread::wait(2000); |
avnisha | 1:52291f3a1895 | 45 | pc.printf("potVal_send_thread executing\n\r"); |
avnisha | 1:52291f3a1895 | 46 | |
avnisha | 1:52291f3a1895 | 47 | |
avnisha | 1:52291f3a1895 | 48 | |
Michael_embed1 | 0:337ae54a3bdb | 49 | } |
Michael_embed1 | 0:337ae54a3bdb | 50 | } |
Michael_embed1 | 0:337ae54a3bdb | 51 | |
Michael_embed1 | 0:337ae54a3bdb | 52 | // Thread tempVal_send_thread() |
Michael_embed1 | 0:337ae54a3bdb | 53 | // Temperature sensor sends value to LCD thread via IPC Queue |
Michael_embed1 | 0:337ae54a3bdb | 54 | void tempVal_send_thread(void const *args) |
Michael_embed1 | 0:337ae54a3bdb | 55 | { |
Michael_embed1 | 0:337ae54a3bdb | 56 | float *tempValMessage; |
Michael_embed1 | 0:337ae54a3bdb | 57 | while(true) |
Michael_embed1 | 0:337ae54a3bdb | 58 | { |
Michael_embed1 | 0:337ae54a3bdb | 59 | // float *tempValMessage = tempVal_mpool.alloc(); |
Michael_embed1 | 0:337ae54a3bdb | 60 | tempValMessage = tempVal_mpool.alloc(); |
avnisha | 1:52291f3a1895 | 61 | if (tempValMessage == NULL){ |
avnisha | 1:52291f3a1895 | 62 | pc.printf("***\n\r"); |
avnisha | 1:52291f3a1895 | 63 | continue; |
avnisha | 1:52291f3a1895 | 64 | } |
Michael_embed1 | 0:337ae54a3bdb | 65 | *tempValMessage = ((tmpSns.read()*9/5)+32);// get Temp update |
avnisha | 1:52291f3a1895 | 66 | tempVal_queue.put(tempValMessage, 1000); // put value in the queue |
avnisha | 1:52291f3a1895 | 67 | Thread::wait(2000); |
avnisha | 1:52291f3a1895 | 68 | pc.printf("tempVal_send_thread executing\n\r"); |
Michael_embed1 | 0:337ae54a3bdb | 69 | } |
Michael_embed1 | 0:337ae54a3bdb | 70 | } |
Michael_embed1 | 0:337ae54a3bdb | 71 | |
Michael_embed1 | 0:337ae54a3bdb | 72 | void lcd_thread(void const *args) |
Michael_embed1 | 0:337ae54a3bdb | 73 | { |
Michael_embed1 | 0:337ae54a3bdb | 74 | osEvent evt1; |
Michael_embed1 | 0:337ae54a3bdb | 75 | osEvent evt2; |
Michael_embed1 | 0:337ae54a3bdb | 76 | |
Michael_embed1 | 0:337ae54a3bdb | 77 | float *tempVal; |
Michael_embed1 | 0:337ae54a3bdb | 78 | potVal_t *pot1Val; |
Michael_embed1 | 0:337ae54a3bdb | 79 | |
Michael_embed1 | 0:337ae54a3bdb | 80 | |
Michael_embed1 | 0:337ae54a3bdb | 81 | while (true) |
Michael_embed1 | 0:337ae54a3bdb | 82 | { |
Michael_embed1 | 0:337ae54a3bdb | 83 | // osEvent evt1 = potVal_queue.get(); |
avnisha | 1:52291f3a1895 | 84 | evt1 = potVal_queue.get(1000); // note timeout |
Michael_embed1 | 0:337ae54a3bdb | 85 | if (evt1.status == osEventMessage) |
Michael_embed1 | 0:337ae54a3bdb | 86 | { |
Michael_embed1 | 0:337ae54a3bdb | 87 | potVal_t *pot1Val = (potVal_t*)evt1.value.p; |
Michael_embed1 | 0:337ae54a3bdb | 88 | pot1Val = (potVal_t*)evt1.value.p; |
Michael_embed1 | 0:337ae54a3bdb | 89 | lcd_mutex.lock(); // exclude other thread access to lcd |
Michael_embed1 | 0:337ae54a3bdb | 90 | lcd.locate(0,0); |
avnisha | 1:52291f3a1895 | 91 | lcd.printf("Pot1=%d\n\r", *pot1Val); |
Michael_embed1 | 0:337ae54a3bdb | 92 | lcd_mutex.unlock(); |
Michael_embed1 | 0:337ae54a3bdb | 93 | potVal_mpool.free(pot1Val); |
Michael_embed1 | 0:337ae54a3bdb | 94 | } |
Michael_embed1 | 0:337ae54a3bdb | 95 | |
avnisha | 1:52291f3a1895 | 96 | pc.printf("evt1 %d\n\r", evt1.status); |
avnisha | 1:52291f3a1895 | 97 | |
Michael_embed1 | 0:337ae54a3bdb | 98 | // osEvent evt2 = tempVal_queue.get(); |
avnisha | 1:52291f3a1895 | 99 | evt2 = tempVal_queue.get(1000); /// note timeout |
Michael_embed1 | 0:337ae54a3bdb | 100 | if (evt2.status == osEventMessage) |
Michael_embed1 | 0:337ae54a3bdb | 101 | { |
avnisha | 1:52291f3a1895 | 102 | // float *tempVal = (float*)evt2.value.p; |
Michael_embed1 | 0:337ae54a3bdb | 103 | tempVal = (float*)evt2.value.p; |
Michael_embed1 | 0:337ae54a3bdb | 104 | lcd_mutex.lock(); // exclude other thread access to lcd |
avnisha | 1:52291f3a1895 | 105 | lcd.locate(0,2); |
avnisha | 1:52291f3a1895 | 106 | lcd.printf("Temp=%3.1f\n\r", *tempVal); |
Michael_embed1 | 0:337ae54a3bdb | 107 | lcd_mutex.unlock(); |
Michael_embed1 | 0:337ae54a3bdb | 108 | tempVal_mpool.free(tempVal); |
Michael_embed1 | 0:337ae54a3bdb | 109 | } |
avnisha | 1:52291f3a1895 | 110 | pc.printf("evt2 %d\n\r", evt2.status); |
avnisha | 1:52291f3a1895 | 111 | |
avnisha | 1:52291f3a1895 | 112 | Thread::wait(500); |
avnisha | 1:52291f3a1895 | 113 | pc.printf("LCD executing\n\r"); // note wait() |
Michael_embed1 | 0:337ae54a3bdb | 114 | |
Michael_embed1 | 0:337ae54a3bdb | 115 | } |
Michael_embed1 | 0:337ae54a3bdb | 116 | } |
Michael_embed1 | 0:337ae54a3bdb | 117 | |
Michael_embed1 | 0:337ae54a3bdb | 118 | int main() { |
avnisha | 1:52291f3a1895 | 119 | |
avnisha | 1:52291f3a1895 | 120 | osPriority pri; |
avnisha | 1:52291f3a1895 | 121 | |
avnisha | 1:52291f3a1895 | 122 | |
avnisha | 1:52291f3a1895 | 123 | |
avnisha | 1:52291f3a1895 | 124 | pc.printf("main started...\n\r"); |
Michael_embed1 | 0:337ae54a3bdb | 125 | lcd.cls(); |
Michael_embed1 | 0:337ae54a3bdb | 126 | Thread thread1(potVal_send_thread); |
Michael_embed1 | 0:337ae54a3bdb | 127 | pc.printf("\nthree threads started..."); |
Michael_embed1 | 0:337ae54a3bdb | 128 | Thread thread2(lcd_thread); |
Michael_embed1 | 0:337ae54a3bdb | 129 | Thread thread3(tempVal_send_thread); |
avnisha | 1:52291f3a1895 | 130 | pri = osPriorityHigh; |
avnisha | 1:52291f3a1895 | 131 | thread2.set_priority(pri); // make sure lcd thread is receiving data and flushing IPC |
avnisha | 1:52291f3a1895 | 132 | pc.printf("three threads started...\n\r"); |
Michael_embed1 | 0:337ae54a3bdb | 133 | |
Michael_embed1 | 0:337ae54a3bdb | 134 | while(true) |
Michael_embed1 | 0:337ae54a3bdb | 135 | { |
Michael_embed1 | 0:337ae54a3bdb | 136 | Thread::wait(1000); |
avnisha | 1:52291f3a1895 | 137 | pc.printf("main thread executing\n\r"); |
Michael_embed1 | 0:337ae54a3bdb | 138 | } |
Michael_embed1 | 0:337ae54a3bdb | 139 | } |
Michael_embed1 | 0:337ae54a3bdb | 140 |