Adopt Callback class in rtos Threads

pull/1802/head
Christopher Haster 2016-05-15 16:50:45 -05:00
parent 2db84dadcb
commit 0180125293
2 changed files with 71 additions and 7 deletions

View File

@ -21,7 +21,7 @@
*/
#include "Thread.h"
#include "mbed_error.h"
#include "mbed.h"
#include "rtos_idle.h"
// rt_tid2ptcb is an internal function which we exposed to get TCB for thread id
@ -42,15 +42,18 @@ Thread::Thread(osPriority priority,
#endif
}
Thread::Thread(void (*task)(void const *argument), void *argument,
osPriority priority, uint32_t stack_size, unsigned char *stack_pointer):
_tid(0), _dynamic_stack(stack_pointer == NULL) {
void Thread::constructor(Callback<void()> task,
osPriority priority, uint32_t stack_size, unsigned char *stack_pointer) {
_tid = 0;
_dynamic_stack = (stack_pointer == NULL);
_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(task, argument)) {
switch (start((void (*)(const void *))Callback<void()>::thunk, &_task)) {
case osErrorResource:
error("OS ran out of threads!\n");
break;
@ -82,7 +85,7 @@ osStatus Thread::start(void (*task)(void const *argument), void *argument) {
_thread_def.stack_pointer[i] = 0xE25A2EA5;
}
#endif
_tid = osThreadCreate(&_thread_def, argument);
_tid = osThreadCreate(&_thread_def, &_task);
if (_tid == NULL) {
if (_dynamic_stack) delete[] (_thread_def.stack_pointer);
return osErrorResource;

View File

@ -24,6 +24,7 @@
#include <stdint.h>
#include "cmsis_os.h"
#include "Callback.h"
namespace rtos {
@ -46,10 +47,62 @@ public:
@param stack_size stack size (in bytes) requirements for the thread function. (default: DEFAULT_STACK_SIZE).
@param stack_pointer pointer to the stack area to be used by this thread (default: NULL).
*/
Thread(mbed::Callback<void()> task,
osPriority priority=osPriorityNormal,
uint32_t stack_size=DEFAULT_STACK_SIZE,
unsigned char *stack_pointer=NULL) {
constructor(task, priority, stack_size, stack_pointer);
}
/** Create a new thread, and start it executing the specified function.
@param obj argument to task.
@param method function to be executed by this thread.
@param argument pointer that is passed to the thread function as start argument. (default: NULL).
@param priority initial priority of the thread function. (default: osPriorityNormal).
@param stack_size stack size (in bytes) requirements for the thread function. (default: DEFAULT_STACK_SIZE).
@param stack_pointer pointer to the stack area to be used by this thread (default: NULL).
*/
template <typename T>
Thread(T *obj, void (T::*method)(),
osPriority priority=osPriorityNormal,
uint32_t stack_size=DEFAULT_STACK_SIZE,
unsigned char *stack_pointer=NULL) {
constructor(mbed::Callback<void()>(obj, method),
priority, stack_size, stack_pointer);
}
/** Create a new thread, and start it executing the specified function.
@param obj argument to task.
@param method function to be executed by this thread.
@param argument pointer that is passed to the thread function as start argument. (default: NULL).
@param priority initial priority of the thread function. (default: osPriorityNormal).
@param stack_size stack size (in bytes) requirements for the thread function. (default: DEFAULT_STACK_SIZE).
@param stack_pointer pointer to the stack area to be used by this thread (default: NULL).
*/
template <typename T>
Thread(T *obj, void (*method)(T *),
osPriority priority=osPriorityNormal,
uint32_t stack_size=DEFAULT_STACK_SIZE,
unsigned char *stack_pointer=NULL) {
constructor(mbed::Callback<void()>(obj, method),
priority, stack_size, stack_pointer);
}
/** Create a new thread, and start it executing the specified function.
Provided for backwards compatibility
@param task function to be executed by this thread.
@param argument pointer that is passed to the thread function as start argument. (default: NULL).
@param priority initial priority of the thread function. (default: osPriorityNormal).
@param stack_size stack size (in bytes) requirements for the thread function. (default: DEFAULT_STACK_SIZE).
@param stack_pointer pointer to the stack area to be used by this thread (default: NULL).
*/
Thread(void (*task)(void const *argument), void *argument=NULL,
osPriority priority=osPriorityNormal,
uint32_t stack_size=DEFAULT_STACK_SIZE,
unsigned char *stack_pointer=NULL);
unsigned char *stack_pointer=NULL) {
constructor(mbed::Callback<void()>(argument, (void (*)(void *))task),
priority, stack_size, stack_pointer);
}
/** Starts a thread executing the specified function.
@param task function to be executed by this thread.
@ -165,6 +218,14 @@ public:
virtual ~Thread();
private:
// Required to share definitions without
// delegated constructors
void constructor(mbed::Callback<void()> task,
osPriority priority=osPriorityNormal,
uint32_t stack_size=DEFAULT_STACK_SIZE,
unsigned char *stack_pointer=NULL);
mbed::Callback<void()> _task;
osThreadId _tid;
osThreadDef_t _thread_def;
bool _dynamic_stack;