Faulty threads with IPC messages

Dependencies:   C12832_lcd LM75B mbed-rtos mbed

Committer:
Michael_embed1
Date:
Wed Mar 12 03:49:02 2014 +0000
Revision:
0:337ae54a3bdb
rev1_mhey_HW6_1

Who changed what in which revision?

UserRevisionLine numberNew 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