TEN MBED OS Course semaphore lab

Committer:
uLipe
Date:
Sun Jan 29 20:42:21 2017 +0000
Revision:
0:a59680ccdb41
first;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
uLipe 0:a59680ccdb41 1 /**
uLipe 0:a59680ccdb41 2 * @brief first thread control program with MBED OS
uLipe 0:a59680ccdb41 3 */
uLipe 0:a59680ccdb41 4 #include "mbed.h"
uLipe 0:a59680ccdb41 5 #include "rtos.h"
uLipe 0:a59680ccdb41 6
uLipe 0:a59680ccdb41 7 /* declares threads for this demo: */
uLipe 0:a59680ccdb41 8 const size_t a_stk_size = 1024;
uLipe 0:a59680ccdb41 9 uint8_t a_stk[a_stk_size];
uLipe 0:a59680ccdb41 10 Thread a_thread(osPriorityHigh, a_stk_size, &a_stk[0]);
uLipe 0:a59680ccdb41 11
uLipe 0:a59680ccdb41 12 const size_t b_stk_size = 1024;
uLipe 0:a59680ccdb41 13 uint8_t b_stk[b_stk_size];
uLipe 0:a59680ccdb41 14 Thread b_thread(osPriorityNormal, b_stk_size, &b_stk[0]);
uLipe 0:a59680ccdb41 15
uLipe 0:a59680ccdb41 16 /* Demo how to declare a semaphore */
uLipe 0:a59680ccdb41 17 Semaphore sema;
uLipe 0:a59680ccdb41 18
uLipe 0:a59680ccdb41 19
uLipe 0:a59680ccdb41 20 /* reserve the debbuger uart to shell interface */
uLipe 0:a59680ccdb41 21 Serial pc_serial(USBTX,USBRX);
uLipe 0:a59680ccdb41 22
uLipe 0:a59680ccdb41 23
uLipe 0:a59680ccdb41 24 /**
uLipe 0:a59680ccdb41 25 * @brief thread a function
uLipe 0:a59680ccdb41 26 */
uLipe 0:a59680ccdb41 27 static void thread_a(void)
uLipe 0:a59680ccdb41 28 {
uLipe 0:a59680ccdb41 29 pc_serial.printf("## started thread_a execution! ##\n\r");
uLipe 0:a59680ccdb41 30
uLipe 0:a59680ccdb41 31 for(;;) {
uLipe 0:a59680ccdb41 32
uLipe 0:a59680ccdb41 33 /* adds dummy processing */
uLipe 0:a59680ccdb41 34 for(int i = 0 ; i < 0xFFFFFF; i++);
uLipe 0:a59680ccdb41 35
uLipe 0:a59680ccdb41 36 pc_serial.printf("## thread_a will take the semaphore! ##\n\r");
uLipe 0:a59680ccdb41 37 //a_thread.yield();
uLipe 0:a59680ccdb41 38
uLipe 0:a59680ccdb41 39 /* once executed, gives thread_a to do so, and sync the two tasks */
uLipe 0:a59680ccdb41 40 sema.wait(osWaitForever);
uLipe 0:a59680ccdb41 41 pc_serial.printf("## thread_a took the semaphore! ##\n\r");
uLipe 0:a59680ccdb41 42
uLipe 0:a59680ccdb41 43 }
uLipe 0:a59680ccdb41 44 }
uLipe 0:a59680ccdb41 45
uLipe 0:a59680ccdb41 46
uLipe 0:a59680ccdb41 47 /**
uLipe 0:a59680ccdb41 48 * @brief thread a function
uLipe 0:a59680ccdb41 49 */
uLipe 0:a59680ccdb41 50 static void thread_b(void)
uLipe 0:a59680ccdb41 51 {
uLipe 0:a59680ccdb41 52 pc_serial.printf("## started thread_b execution! ##\n\r");
uLipe 0:a59680ccdb41 53
uLipe 0:a59680ccdb41 54 for(;;) {
uLipe 0:a59680ccdb41 55
uLipe 0:a59680ccdb41 56 /* adds dummy processing */
uLipe 0:a59680ccdb41 57 for(int i = 0 ; i < 0xFFFFFF; i++);
uLipe 0:a59680ccdb41 58
uLipe 0:a59680ccdb41 59 pc_serial.printf("## thread_b will signal the semaphore! ##\n\r");
uLipe 0:a59680ccdb41 60
uLipe 0:a59680ccdb41 61 //b_thread.yield();
uLipe 0:a59680ccdb41 62
uLipe 0:a59680ccdb41 63 /* release the semaphore and allow the high priority task to run */
uLipe 0:a59680ccdb41 64 sema.release();
uLipe 0:a59680ccdb41 65 pc_serial.printf("## thread_b signaled the semaphore, but thread_a consumed it! ##\n\r");
uLipe 0:a59680ccdb41 66 }
uLipe 0:a59680ccdb41 67 }
uLipe 0:a59680ccdb41 68
uLipe 0:a59680ccdb41 69
uLipe 0:a59680ccdb41 70
uLipe 0:a59680ccdb41 71 /**
uLipe 0:a59680ccdb41 72 * @brief main application loop
uLipe 0:a59680ccdb41 73 */
uLipe 0:a59680ccdb41 74 int main(void)
uLipe 0:a59680ccdb41 75 {
uLipe 0:a59680ccdb41 76 pc_serial.baud(115200);
uLipe 0:a59680ccdb41 77 a_thread.start(thread_a);
uLipe 0:a59680ccdb41 78 b_thread.start(thread_b);
uLipe 0:a59680ccdb41 79 return 0;
uLipe 0:a59680ccdb41 80 }