TEN MBED OS Course mempool_queue lab

Committer:
uLipe
Date:
Sun Jan 29 20:41:14 2017 +0000
Revision:
0:89c82c16102e
first

Who changed what in which revision?

UserRevisionLine numberNew contents of line
uLipe 0:89c82c16102e 1 /**
uLipe 0:89c82c16102e 2 * @brief first thread control program with MBED OS
uLipe 0:89c82c16102e 3 */
uLipe 0:89c82c16102e 4 #include "mbed.h"
uLipe 0:89c82c16102e 5 #include "rtos.h"
uLipe 0:89c82c16102e 6
uLipe 0:89c82c16102e 7 /* declares threads for this demo: */
uLipe 0:89c82c16102e 8 const size_t a_stk_size = 1024;
uLipe 0:89c82c16102e 9 uint8_t a_stk[a_stk_size];
uLipe 0:89c82c16102e 10 Thread a_thread(osPriorityHigh, a_stk_size, &a_stk[0]);
uLipe 0:89c82c16102e 11
uLipe 0:89c82c16102e 12 const size_t b_stk_size = 1024;
uLipe 0:89c82c16102e 13 uint8_t b_stk[b_stk_size];
uLipe 0:89c82c16102e 14 Thread b_thread(osPriorityNormal, b_stk_size, &b_stk[0]);
uLipe 0:89c82c16102e 15
uLipe 0:89c82c16102e 16 /* define a request and reply struct */
uLipe 0:89c82c16102e 17 typedef struct {
uLipe 0:89c82c16102e 18 char sender[64];
uLipe 0:89c82c16102e 19 char request[64];
uLipe 0:89c82c16102e 20 char how_much[64];
uLipe 0:89c82c16102e 21 }request ;
uLipe 0:89c82c16102e 22
uLipe 0:89c82c16102e 23
uLipe 0:89c82c16102e 24 typedef struct {
uLipe 0:89c82c16102e 25 char responser[64];
uLipe 0:89c82c16102e 26 char response[64];
uLipe 0:89c82c16102e 27 char order[64];
uLipe 0:89c82c16102e 28 }response;
uLipe 0:89c82c16102e 29
uLipe 0:89c82c16102e 30
uLipe 0:89c82c16102e 31 /* reserve the debbuger uart to shell interface */
uLipe 0:89c82c16102e 32 Serial pc_serial(USBTX,USBRX);
uLipe 0:89c82c16102e 33
uLipe 0:89c82c16102e 34 /* allocate a mail + memory pool combo to this demo */
uLipe 0:89c82c16102e 35 Mail<request, 8> req_q;
uLipe 0:89c82c16102e 36 Mail<response, 8>rep_q;
uLipe 0:89c82c16102e 37
uLipe 0:89c82c16102e 38
uLipe 0:89c82c16102e 39 /**
uLipe 0:89c82c16102e 40 * @brief thread a function
uLipe 0:89c82c16102e 41 */
uLipe 0:89c82c16102e 42 static void thread_a(void)
uLipe 0:89c82c16102e 43 {
uLipe 0:89c82c16102e 44 osEvent evt;
uLipe 0:89c82c16102e 45 int orders = 1;
uLipe 0:89c82c16102e 46
uLipe 0:89c82c16102e 47 for(;;) {
uLipe 0:89c82c16102e 48 /* mount a request for the other thread: */
uLipe 0:89c82c16102e 49 request *r = req_q.alloc();
uLipe 0:89c82c16102e 50 if(r != NULL) {
uLipe 0:89c82c16102e 51 strcpy(&r->sender[0], "thread_a");
uLipe 0:89c82c16102e 52 strcpy(&r->request[0], "I want coffee, please!");
uLipe 0:89c82c16102e 53 strcpy(&r->how_much[0], "Two cups, with no sugar!");
uLipe 0:89c82c16102e 54
uLipe 0:89c82c16102e 55 /* send the response to waiter task */
uLipe 0:89c82c16102e 56 req_q.put(r);
uLipe 0:89c82c16102e 57
uLipe 0:89c82c16102e 58 /* waits for respose and post here */
uLipe 0:89c82c16102e 59 evt = rep_q.get(osWaitForever);
uLipe 0:89c82c16102e 60 response *rep = (response *)evt.value.p;
uLipe 0:89c82c16102e 61
uLipe 0:89c82c16102e 62 /* prints the response */
uLipe 0:89c82c16102e 63 pc_serial.printf("## responser: %s ##\n\r", rep->responser);
uLipe 0:89c82c16102e 64 pc_serial.printf("## response: %s ##\n\r", rep->response);
uLipe 0:89c82c16102e 65 pc_serial.printf("## order: %s ##\n\r",rep->order);
uLipe 0:89c82c16102e 66 pc_serial.printf("## got the order: %d ## \n\r", orders++);
uLipe 0:89c82c16102e 67 /* freem memory */
uLipe 0:89c82c16102e 68 rep_q.free(rep);
uLipe 0:89c82c16102e 69
uLipe 0:89c82c16102e 70 a_thread.wait(1000);
uLipe 0:89c82c16102e 71 }
uLipe 0:89c82c16102e 72 }
uLipe 0:89c82c16102e 73 }
uLipe 0:89c82c16102e 74
uLipe 0:89c82c16102e 75
uLipe 0:89c82c16102e 76 /**
uLipe 0:89c82c16102e 77 * @brief thread a function
uLipe 0:89c82c16102e 78 */
uLipe 0:89c82c16102e 79 static void thread_b(void)
uLipe 0:89c82c16102e 80 {
uLipe 0:89c82c16102e 81 osEvent evt;
uLipe 0:89c82c16102e 82
uLipe 0:89c82c16102e 83 for(;;) {
uLipe 0:89c82c16102e 84 /* waits for respose and post here */
uLipe 0:89c82c16102e 85 evt = req_q.get(osWaitForever);
uLipe 0:89c82c16102e 86 request *req = (request *)evt.value.p;
uLipe 0:89c82c16102e 87
uLipe 0:89c82c16102e 88 /* prints the response */
uLipe 0:89c82c16102e 89 pc_serial.printf("## sender: %s ##\n\r",req->sender);
uLipe 0:89c82c16102e 90 pc_serial.printf("## request: %s ##\n\r",req->request);
uLipe 0:89c82c16102e 91 pc_serial.printf("## how_muc: %s ##\n\r",req->how_much);
uLipe 0:89c82c16102e 92 req_q.free(req);
uLipe 0:89c82c16102e 93
uLipe 0:89c82c16102e 94 response *r = rep_q.alloc();
uLipe 0:89c82c16102e 95 if(r != NULL) {
uLipe 0:89c82c16102e 96 strcpy(&r->responser[0], "thread_b");
uLipe 0:89c82c16102e 97 strcpy(&r->response[0], "Of course! here your coffe");
uLipe 0:89c82c16102e 98 strcpy(&r->order[0], "Two cups, hot, with no sugar!");
uLipe 0:89c82c16102e 99 /* send the response to waiter task */
uLipe 0:89c82c16102e 100 rep_q.put(r);
uLipe 0:89c82c16102e 101 }
uLipe 0:89c82c16102e 102 }
uLipe 0:89c82c16102e 103 }
uLipe 0:89c82c16102e 104
uLipe 0:89c82c16102e 105
uLipe 0:89c82c16102e 106
uLipe 0:89c82c16102e 107 /**
uLipe 0:89c82c16102e 108 * @brief main application loop
uLipe 0:89c82c16102e 109 */
uLipe 0:89c82c16102e 110 int main(void)
uLipe 0:89c82c16102e 111 {
uLipe 0:89c82c16102e 112 pc_serial.baud(115200);
uLipe 0:89c82c16102e 113 a_thread.start(thread_a);
uLipe 0:89c82c16102e 114 b_thread.start(thread_b);
uLipe 0:89c82c16102e 115 return 0;
uLipe 0:89c82c16102e 116 }