#define START_THREAD(name,param) start_thread(get_thread_idx(#name), param)
#define JOIN_THREAD(name) join_thread(get_thread_idx(#name))
#define CHANGE_THREAD_PRIO(name, priority) change_thread_prio(get_thread_idx(#name), priority)
#define GET_THREAD_HANDLE(name) get_thread_handle(get_thread_idx(#name))
#define RESUME_THREAD(name) resume_thread(get_thread_idx(#name))
#define SUSPEND_THREAD(name) suspend_thread(get_thread_idx(#name))
#define THREAD_NO_PARAM (0)
typedef pthread_t THREAD_HANDLE;
typedef void *THREAD_PARAMS;
typedef void *THREAD_RET;
typedef THREAD_RET (*THREAD_ROUTINE) (THREAD_PARAMS);
#define THREAD_RETURN(value) return ((void*)value)
#define DEFINE_THREAD_ROUTINE(NomRoutine,NomParams) THREAD_RET WINAPI thread_##NomRoutine(THREAD_PARAMS NomParams)
DEFINE_THREAD_ROUTINE(mobile_main, data)
{
...
}
DEFINE_THREAD_ROUTINE(ardrone_control, nomParams)
{
...
}
DEFINE_THREAD_ROUTINE(navdata_update, nomParams)
{
...
}
DEFINE_THREAD_ROUTINE(video_recorder, data)
{
...
}
DEFINE_THREAD_ROUTINE(video_stage, data)
{
...
}
typedefstruct
{
char* name;
int32_t priority;
int32_t stackSize;
int8_t* stack;
THREAD_PARAMS parameters;
THREAD_ROUTINE routine;
THREAD_HANDLE handle;
DEFINE_CYG_THREAD
} thread_table_entry_t;
#define BEGIN_THREAD_TABLE \
thread_table_entry_t threadTable[] = {
#define END_THREAD_TABLE \
{ 0 } \
};
#define THREAD_TABLE_ENTRY(name, priority) \
{ #name, priority, 0, 0, THREAD_NO_PARAM, thread_##name, 0, DECLARE_CYG_THREAD },
BEGIN_THREAD_TABLE
THREAD_TABLE_ENTRY(mobile_main, AT_THREAD_PRIORITY)
THREAD_TABLE_ENTRY(ardrone_control, NAVDATA_THREAD_PRIORITY)
THREAD_TABLE_ENTRY(navdata_update, NAVDATA_THREAD_PRIORITY)
THREAD_TABLE_ENTRY(video_stage, VIDEO_THREAD_PRIORITY)
THREAD_TABLE_ENTRY(video_recorder, VIDEO_RECORDER_THREAD_PRIORITY)
END_THREAD_TABLE