First

Fork of TEN_mbedos_threads by Qmax

Committer:
edenrokey
Date:
Thu Mar 02 12:07:13 2017 +0000
Revision:
2:967778096fa0
Robert first checkin

Who changed what in which revision?

UserRevisionLine numberNew contents of line
edenrokey 2:967778096fa0 1 /**
edenrokey 2:967778096fa0 2 * @brief first thread control program with MBED OS
edenrokey 2:967778096fa0 3 */
edenrokey 2:967778096fa0 4 #include "mbed.h"
edenrokey 2:967778096fa0 5 #include "rtos.h"
edenrokey 2:967778096fa0 6
edenrokey 2:967778096fa0 7 #define THREAD_A "thread_a"
edenrokey 2:967778096fa0 8 #define THREAD_B "thread_b"
edenrokey 2:967778096fa0 9 #define THREAD_C "thread_c"
edenrokey 2:967778096fa0 10
edenrokey 2:967778096fa0 11 InterruptIn button(PC_13);
edenrokey 2:967778096fa0 12
edenrokey 2:967778096fa0 13 DigitalOut led1(LED1);
edenrokey 2:967778096fa0 14 DigitalOut led2(PA_11);
edenrokey 2:967778096fa0 15 DigitalOut led3(PA_12);
edenrokey 2:967778096fa0 16
edenrokey 2:967778096fa0 17 /* reserve the debbuger uart to shell interface */
edenrokey 2:967778096fa0 18 Serial pc_serial(USBTX,USBRX);
edenrokey 2:967778096fa0 19
edenrokey 2:967778096fa0 20 /* declares threads for this demo: */
edenrokey 2:967778096fa0 21 const size_t a_stk_size = 512;
edenrokey 2:967778096fa0 22 uint8_t a_stk[a_stk_size];
edenrokey 2:967778096fa0 23 Thread a_thread(osPriorityNormal, a_stk_size, &a_stk[0]);
edenrokey 2:967778096fa0 24
edenrokey 2:967778096fa0 25 const size_t b_stk_size = 512;
edenrokey 2:967778096fa0 26 uint8_t b_stk[b_stk_size];
edenrokey 2:967778096fa0 27 Thread b_thread(osPriorityNormal, b_stk_size, &b_stk[0]);
edenrokey 2:967778096fa0 28
edenrokey 2:967778096fa0 29 const size_t c_stk_size = 512;
edenrokey 2:967778096fa0 30 uint8_t c_stk[c_stk_size];
edenrokey 2:967778096fa0 31 Thread c_thread(osPriorityNormal, c_stk_size, &c_stk[0]);
edenrokey 2:967778096fa0 32
edenrokey 2:967778096fa0 33 const size_t e_stk_size = 512;
edenrokey 2:967778096fa0 34 uint8_t e_stk[e_stk_size];
edenrokey 2:967778096fa0 35 Thread eventThread(osPriorityNormal, e_stk_size, &e_stk[0]);
edenrokey 2:967778096fa0 36
edenrokey 2:967778096fa0 37 // create an event queue
edenrokey 2:967778096fa0 38 EventQueue queue;
edenrokey 2:967778096fa0 39
edenrokey 2:967778096fa0 40 uint32_t count = 0;
edenrokey 2:967778096fa0 41
edenrokey 2:967778096fa0 42 void do_something() {
edenrokey 2:967778096fa0 43 // this now runs in the context of eventThread, instead of in the ISR
edenrokey 2:967778096fa0 44 count++;
edenrokey 2:967778096fa0 45 printf("Toggling LED!\r\n");
edenrokey 2:967778096fa0 46 for(int i = 0 ; i < 0xFFFFFF; i++);
edenrokey 2:967778096fa0 47 led3 = !led3;
edenrokey 2:967778096fa0 48 printf("Toggled LED count = %d \r\n", count);
edenrokey 2:967778096fa0 49 }
edenrokey 2:967778096fa0 50
edenrokey 2:967778096fa0 51 /**
edenrokey 2:967778096fa0 52 * @brief thread a function
edenrokey 2:967778096fa0 53 */
edenrokey 2:967778096fa0 54 static void thread(void const *buf)
edenrokey 2:967778096fa0 55 {
edenrokey 2:967778096fa0 56 uint32_t execs = 0;
edenrokey 2:967778096fa0 57 pc_serial.printf("## started %s execution! ##\n\r", (char *)buf);
edenrokey 2:967778096fa0 58
edenrokey 2:967778096fa0 59 for(;;) {
edenrokey 2:967778096fa0 60 execs++;
edenrokey 2:967778096fa0 61 /* adds dummy processing */
edenrokey 2:967778096fa0 62 for(int i = 0 ; i < 0xFFFFFF; i++);
edenrokey 2:967778096fa0 63 pc_serial.printf("## %s executed %d times! ##\n\r", (char *)buf, execs);
edenrokey 2:967778096fa0 64 led1 = !led1;
edenrokey 2:967778096fa0 65 Thread::yield();
edenrokey 2:967778096fa0 66 }
edenrokey 2:967778096fa0 67 }
edenrokey 2:967778096fa0 68
edenrokey 2:967778096fa0 69 static void thread2(void const *buf)
edenrokey 2:967778096fa0 70 {
edenrokey 2:967778096fa0 71 uint32_t execs = 0;
edenrokey 2:967778096fa0 72 pc_serial.printf("## started %s execution! ##\n\r", (char *)buf);
edenrokey 2:967778096fa0 73
edenrokey 2:967778096fa0 74 for(;;) {
edenrokey 2:967778096fa0 75 execs++;
edenrokey 2:967778096fa0 76 /* adds dummy processing */
edenrokey 2:967778096fa0 77 for(int i = 0 ; i < 0xF00000; i++);
edenrokey 2:967778096fa0 78 pc_serial.printf("## %s executed %d times! ##\n\r", (char *)buf, execs);
edenrokey 2:967778096fa0 79 led2 = !led2;
edenrokey 2:967778096fa0 80 Thread::yield();
edenrokey 2:967778096fa0 81 }
edenrokey 2:967778096fa0 82 }
edenrokey 2:967778096fa0 83
edenrokey 2:967778096fa0 84 static void thread3(void const *buf)
edenrokey 2:967778096fa0 85 {
edenrokey 2:967778096fa0 86 uint32_t execs = 0;
edenrokey 2:967778096fa0 87 pc_serial.printf("## started %s execution! ##\n\r", (char *)buf);
edenrokey 2:967778096fa0 88
edenrokey 2:967778096fa0 89 for(;;) {
edenrokey 2:967778096fa0 90 execs++;
edenrokey 2:967778096fa0 91 /* adds dummy processing */
edenrokey 2:967778096fa0 92 for(int i = 0 ; i < 0xFFFFFF; i++);
edenrokey 2:967778096fa0 93 pc_serial.printf("## %s executed %d times! ##\n\r", (char *)buf, execs);
edenrokey 2:967778096fa0 94 led3 = !led3;
edenrokey 2:967778096fa0 95 Thread::yield();
edenrokey 2:967778096fa0 96 }
edenrokey 2:967778096fa0 97 }
edenrokey 2:967778096fa0 98
edenrokey 2:967778096fa0 99 /**
edenrokey 2:967778096fa0 100 * @brief main application loop
edenrokey 2:967778096fa0 101 */
edenrokey 2:967778096fa0 102 int main(void)
edenrokey 2:967778096fa0 103 {
edenrokey 2:967778096fa0 104 pc_serial.baud(115200);
edenrokey 2:967778096fa0 105 a_thread.start(callback(thread, (void *)THREAD_A));
edenrokey 2:967778096fa0 106 b_thread.start(callback(thread2, (void *)THREAD_B));
edenrokey 2:967778096fa0 107 /*c_thread.start(callback(thread3, (void *)THREAD_C));*/
edenrokey 2:967778096fa0 108
edenrokey 2:967778096fa0 109 eventThread.start(callback(&queue, &EventQueue::dispatch_forever));
edenrokey 2:967778096fa0 110
edenrokey 2:967778096fa0 111 // wrap calls in queue.event to automatically defer to the queue's thread
edenrokey 2:967778096fa0 112 button.fall(queue.event(&do_something));
edenrokey 2:967778096fa0 113
edenrokey 2:967778096fa0 114
edenrokey 2:967778096fa0 115 return 0;
edenrokey 2:967778096fa0 116 }