
First
Fork of TEN_mbedos_threads by
main_copy.cpp@2:967778096fa0, 2017-03-02 (annotated)
- Committer:
- edenrokey
- Date:
- Thu Mar 02 12:07:13 2017 +0000
- Revision:
- 2:967778096fa0
Robert first checkin
Who changed what in which revision?
User | Revision | Line number | New 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 | } |