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@0:337ae54a3bdb, 2014-03-12 (annotated)
- Committer:
- Michael_embed1
- Date:
- Wed Mar 12 03:49:02 2014 +0000
- Revision:
- 0:337ae54a3bdb
- Child:
- 1:52291f3a1895
rev1_mhey_HW6_1
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(); |
Michael_embed1 | 0:337ae54a3bdb | 38 | *potValMessage = Pot1.read_u16(); // get Pot1 value |
Michael_embed1 | 0:337ae54a3bdb | 39 | potVal_queue.put(potValMessage); // put it in the queue |
Michael_embed1 | 0:337ae54a3bdb | 40 | Thread::wait(1000); // wait 1.0s |
Michael_embed1 | 0:337ae54a3bdb | 41 | } |
Michael_embed1 | 0:337ae54a3bdb | 42 | } |
Michael_embed1 | 0:337ae54a3bdb | 43 | |
Michael_embed1 | 0:337ae54a3bdb | 44 | // Thread tempVal_send_thread() |
Michael_embed1 | 0:337ae54a3bdb | 45 | // Temperature sensor sends value to LCD thread via IPC Queue |
Michael_embed1 | 0:337ae54a3bdb | 46 | void tempVal_send_thread(void const *args) |
Michael_embed1 | 0:337ae54a3bdb | 47 | { |
Michael_embed1 | 0:337ae54a3bdb | 48 | float *tempValMessage; |
Michael_embed1 | 0:337ae54a3bdb | 49 | while(true) |
Michael_embed1 | 0:337ae54a3bdb | 50 | { |
Michael_embed1 | 0:337ae54a3bdb | 51 | // float *tempValMessage = tempVal_mpool.alloc(); |
Michael_embed1 | 0:337ae54a3bdb | 52 | tempValMessage = tempVal_mpool.alloc(); |
Michael_embed1 | 0:337ae54a3bdb | 53 | *tempValMessage = ((tmpSns.read()*9/5)+32);// get Temp update |
Michael_embed1 | 0:337ae54a3bdb | 54 | tempVal_queue.put(tempValMessage); // put value in the queue |
Michael_embed1 | 0:337ae54a3bdb | 55 | Thread::wait(1000); // wait 0.5s |
Michael_embed1 | 0:337ae54a3bdb | 56 | pc.printf("\ntempVal_send_thread executing"); |
Michael_embed1 | 0:337ae54a3bdb | 57 | } |
Michael_embed1 | 0:337ae54a3bdb | 58 | } |
Michael_embed1 | 0:337ae54a3bdb | 59 | |
Michael_embed1 | 0:337ae54a3bdb | 60 | void lcd_thread(void const *args) |
Michael_embed1 | 0:337ae54a3bdb | 61 | { |
Michael_embed1 | 0:337ae54a3bdb | 62 | osEvent evt1; |
Michael_embed1 | 0:337ae54a3bdb | 63 | osEvent evt2; |
Michael_embed1 | 0:337ae54a3bdb | 64 | |
Michael_embed1 | 0:337ae54a3bdb | 65 | float *tempVal; |
Michael_embed1 | 0:337ae54a3bdb | 66 | potVal_t *pot1Val; |
Michael_embed1 | 0:337ae54a3bdb | 67 | |
Michael_embed1 | 0:337ae54a3bdb | 68 | |
Michael_embed1 | 0:337ae54a3bdb | 69 | while (true) |
Michael_embed1 | 0:337ae54a3bdb | 70 | { |
Michael_embed1 | 0:337ae54a3bdb | 71 | // osEvent evt1 = potVal_queue.get(); |
Michael_embed1 | 0:337ae54a3bdb | 72 | evt1 = potVal_queue.get(); |
Michael_embed1 | 0:337ae54a3bdb | 73 | if (evt1.status == osEventMessage) |
Michael_embed1 | 0:337ae54a3bdb | 74 | { |
Michael_embed1 | 0:337ae54a3bdb | 75 | potVal_t *pot1Val = (potVal_t*)evt1.value.p; |
Michael_embed1 | 0:337ae54a3bdb | 76 | pot1Val = (potVal_t*)evt1.value.p; |
Michael_embed1 | 0:337ae54a3bdb | 77 | lcd_mutex.lock(); // exclude other thread access to lcd |
Michael_embed1 | 0:337ae54a3bdb | 78 | lcd.locate(0,0); |
Michael_embed1 | 0:337ae54a3bdb | 79 | lcd.printf("\nPot1=%d", *pot1Val); |
Michael_embed1 | 0:337ae54a3bdb | 80 | lcd_mutex.unlock(); |
Michael_embed1 | 0:337ae54a3bdb | 81 | potVal_mpool.free(pot1Val); |
Michael_embed1 | 0:337ae54a3bdb | 82 | } |
Michael_embed1 | 0:337ae54a3bdb | 83 | |
Michael_embed1 | 0:337ae54a3bdb | 84 | // osEvent evt2 = tempVal_queue.get(); |
Michael_embed1 | 0:337ae54a3bdb | 85 | evt2 = tempVal_queue.get(); |
Michael_embed1 | 0:337ae54a3bdb | 86 | if (evt2.status == osEventMessage) |
Michael_embed1 | 0:337ae54a3bdb | 87 | // pc.printf("\nevt2.status == osEventMessage"); |
Michael_embed1 | 0:337ae54a3bdb | 88 | { |
Michael_embed1 | 0:337ae54a3bdb | 89 | // float *tempVal = (float*)evt2.value.p; |
Michael_embed1 | 0:337ae54a3bdb | 90 | tempVal = (float*)evt2.value.p; |
Michael_embed1 | 0:337ae54a3bdb | 91 | lcd_mutex.lock(); // exclude other thread access to lcd |
Michael_embed1 | 0:337ae54a3bdb | 92 | lcd.locate(0,20); |
Michael_embed1 | 0:337ae54a3bdb | 93 | lcd.printf("\nTemp=%3.1f", *tempVal); |
Michael_embed1 | 0:337ae54a3bdb | 94 | lcd_mutex.unlock(); |
Michael_embed1 | 0:337ae54a3bdb | 95 | tempVal_mpool.free(tempVal); |
Michael_embed1 | 0:337ae54a3bdb | 96 | } |
Michael_embed1 | 0:337ae54a3bdb | 97 | |
Michael_embed1 | 0:337ae54a3bdb | 98 | } |
Michael_embed1 | 0:337ae54a3bdb | 99 | } |
Michael_embed1 | 0:337ae54a3bdb | 100 | |
Michael_embed1 | 0:337ae54a3bdb | 101 | int main() { |
Michael_embed1 | 0:337ae54a3bdb | 102 | pc.printf("\nmain started..."); |
Michael_embed1 | 0:337ae54a3bdb | 103 | lcd.cls(); |
Michael_embed1 | 0:337ae54a3bdb | 104 | Thread thread1(potVal_send_thread); |
Michael_embed1 | 0:337ae54a3bdb | 105 | pc.printf("\nthree threads started..."); |
Michael_embed1 | 0:337ae54a3bdb | 106 | Thread thread2(lcd_thread); |
Michael_embed1 | 0:337ae54a3bdb | 107 | Thread thread3(tempVal_send_thread); |
Michael_embed1 | 0:337ae54a3bdb | 108 | pc.printf("\nthree threads started..."); |
Michael_embed1 | 0:337ae54a3bdb | 109 | |
Michael_embed1 | 0:337ae54a3bdb | 110 | while(true) |
Michael_embed1 | 0:337ae54a3bdb | 111 | { |
Michael_embed1 | 0:337ae54a3bdb | 112 | Thread::wait(1000); |
Michael_embed1 | 0:337ae54a3bdb | 113 | } |
Michael_embed1 | 0:337ae54a3bdb | 114 | } |
Michael_embed1 | 0:337ae54a3bdb | 115 |