From e079c2e0e9c9f1a8f08ba2f50f14c2fb4b6780b3 Mon Sep 17 00:00:00 2001 From: Christopher Haster Date: Wed, 1 Jun 2016 12:11:05 -0500 Subject: [PATCH] Added support for Callback to Thread lifetime --- rtos/rtos/Thread.cpp | 26 +++++++++++--------------- rtos/rtos/Thread.h | 20 +++++++++++++++++--- 2 files changed, 28 insertions(+), 18 deletions(-) diff --git a/rtos/rtos/Thread.cpp b/rtos/rtos/Thread.cpp index bf125bc450..f9694bd6f6 100644 --- a/rtos/rtos/Thread.cpp +++ b/rtos/rtos/Thread.cpp @@ -32,9 +32,11 @@ extern "C" P_TCB rt_tid2ptcb(osThreadId thread_id); namespace rtos { -Thread::Thread(osPriority priority, - uint32_t stack_size, unsigned char *stack_pointer): - _tid(0), _dynamic_stack(stack_pointer == NULL) { +void Thread::constructor(osPriority priority, + uint32_t stack_size, unsigned char *stack_pointer) { + _tid = 0; + _dynamic_stack = (stack_pointer == NULL); + #if defined(__MBED_CMSIS_RTOS_CA9) || defined(__MBED_CMSIS_RTOS_CM) _thread_def.tpriority = priority; _thread_def.stacksize = stack_size; @@ -44,16 +46,9 @@ Thread::Thread(osPriority priority, void Thread::constructor(Callback task, osPriority priority, uint32_t stack_size, unsigned char *stack_pointer) { - _tid = 0; - _dynamic_stack = (stack_pointer == NULL); + constructor(priority, stack_size, stack_pointer); - _task = task; -#if defined(__MBED_CMSIS_RTOS_CA9) || defined(__MBED_CMSIS_RTOS_CM) - _thread_def.tpriority = priority; - _thread_def.stacksize = stack_size; - _thread_def.stack_pointer = (uint32_t*)stack_pointer; -#endif - switch (start((void (*)(const void *))Callback::thunk, &_task)) { + switch (start(task)) { case osErrorResource: error("OS ran out of threads!\n"); break; @@ -67,13 +62,13 @@ void Thread::constructor(Callback task, } } -osStatus Thread::start(void (*task)(void const *argument), void *argument) { - if (_tid != NULL) { +osStatus Thread::start(Callback task) { + if (_tid != 0) { return osErrorParameter; } #if defined(__MBED_CMSIS_RTOS_CA9) || defined(__MBED_CMSIS_RTOS_CM) - _thread_def.pthread = task; + _thread_def.pthread = (void (*)(const void *))Callback::thunk; if (_thread_def.stack_pointer == NULL) { _thread_def.stack_pointer = new uint32_t[_thread_def.stacksize/sizeof(uint32_t)]; if (_thread_def.stack_pointer == NULL) @@ -85,6 +80,7 @@ osStatus Thread::start(void (*task)(void const *argument), void *argument) { _thread_def.stack_pointer[i] = 0xE25A2EA5; } #endif + _task = task; _tid = osThreadCreate(&_thread_def, &_task); if (_tid == NULL) { if (_dynamic_stack) delete[] (_thread_def.stack_pointer); diff --git a/rtos/rtos/Thread.h b/rtos/rtos/Thread.h index 243640e884..93880117ff 100644 --- a/rtos/rtos/Thread.h +++ b/rtos/rtos/Thread.h @@ -38,7 +38,9 @@ public: */ Thread(osPriority priority=osPriorityNormal, uint32_t stack_size=DEFAULT_STACK_SIZE, - unsigned char *stack_pointer=NULL); + unsigned char *stack_pointer=NULL) { + constructor(priority, stack_size, stack_pointer); + } /** Create a new thread, and start it executing the specified function. @param task function to be executed by this thread. @@ -106,10 +108,19 @@ public: /** Starts a thread executing the specified function. @param task function to be executed by this thread. - @param argument pointer that is passed to the thread function as start argument. (default: NULL). @return status code that indicates the execution status of the function. */ - osStatus start(void (*task)(void const *argument), void *argument=NULL); + osStatus start(mbed::Callback task); + + /** Starts a thread executing the specified function. + @param obj argument to task + @param method function to be executed by this thread. + @return status code that indicates the execution status of the function. + */ + template + osStatus start(T *obj, M method) { + return start(mbed::Callback(obj, method)); + } /** Wait for thread to terminate @return status code that indicates the execution status of the function. @@ -220,6 +231,9 @@ public: private: // Required to share definitions without // delegated constructors + void constructor(osPriority priority=osPriorityNormal, + uint32_t stack_size=DEFAULT_STACK_SIZE, + unsigned char *stack_pointer=NULL); void constructor(mbed::Callback task, osPriority priority=osPriorityNormal, uint32_t stack_size=DEFAULT_STACK_SIZE,