Robert Kennedy
/
TEN_mbedos_threads_robert
Fork of TEN_mbedos_threads by
Diff: main_copy.cpp
- Revision:
- 2:967778096fa0
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main_copy.cpp Thu Mar 02 12:07:13 2017 +0000 @@ -0,0 +1,116 @@ +/** + * @brief first thread control program with MBED OS + */ +#include "mbed.h" +#include "rtos.h" + +#define THREAD_A "thread_a" +#define THREAD_B "thread_b" +#define THREAD_C "thread_c" + +InterruptIn button(PC_13); + +DigitalOut led1(LED1); +DigitalOut led2(PA_11); +DigitalOut led3(PA_12); + +/* reserve the debbuger uart to shell interface */ +Serial pc_serial(USBTX,USBRX); + +/* declares threads for this demo: */ +const size_t a_stk_size = 512; +uint8_t a_stk[a_stk_size]; +Thread a_thread(osPriorityNormal, a_stk_size, &a_stk[0]); + +const size_t b_stk_size = 512; +uint8_t b_stk[b_stk_size]; +Thread b_thread(osPriorityNormal, b_stk_size, &b_stk[0]); + +const size_t c_stk_size = 512; +uint8_t c_stk[c_stk_size]; +Thread c_thread(osPriorityNormal, c_stk_size, &c_stk[0]); + +const size_t e_stk_size = 512; +uint8_t e_stk[e_stk_size]; +Thread eventThread(osPriorityNormal, e_stk_size, &e_stk[0]); + +// create an event queue +EventQueue queue; + +uint32_t count = 0; + +void do_something() { + // this now runs in the context of eventThread, instead of in the ISR + count++; + printf("Toggling LED!\r\n"); + for(int i = 0 ; i < 0xFFFFFF; i++); + led3 = !led3; + printf("Toggled LED count = %d \r\n", count); +} + +/** + * @brief thread a function + */ +static void thread(void const *buf) +{ + uint32_t execs = 0; + pc_serial.printf("## started %s execution! ##\n\r", (char *)buf); + + for(;;) { + execs++; + /* adds dummy processing */ + for(int i = 0 ; i < 0xFFFFFF; i++); + pc_serial.printf("## %s executed %d times! ##\n\r", (char *)buf, execs); + led1 = !led1; + Thread::yield(); + } +} + +static void thread2(void const *buf) +{ + uint32_t execs = 0; + pc_serial.printf("## started %s execution! ##\n\r", (char *)buf); + + for(;;) { + execs++; + /* adds dummy processing */ + for(int i = 0 ; i < 0xF00000; i++); + pc_serial.printf("## %s executed %d times! ##\n\r", (char *)buf, execs); + led2 = !led2; + Thread::yield(); + } +} + +static void thread3(void const *buf) +{ + uint32_t execs = 0; + pc_serial.printf("## started %s execution! ##\n\r", (char *)buf); + + for(;;) { + execs++; + /* adds dummy processing */ + for(int i = 0 ; i < 0xFFFFFF; i++); + pc_serial.printf("## %s executed %d times! ##\n\r", (char *)buf, execs); + led3 = !led3; + Thread::yield(); + } +} + +/** + * @brief main application loop + */ +int main(void) +{ + pc_serial.baud(115200); + a_thread.start(callback(thread, (void *)THREAD_A)); + b_thread.start(callback(thread2, (void *)THREAD_B)); + /*c_thread.start(callback(thread3, (void *)THREAD_C));*/ + + eventThread.start(callback(&queue, &EventQueue::dispatch_forever)); + + // wrap calls in queue.event to automatically defer to the queue's thread + button.fall(queue.event(&do_something)); + + + return 0; +} \ No newline at end of file