2 * \brief VP Api. Thread utility.
3 * \brief These macros are there to help static declaration of threads and their management.
4 * \author Sylvain Gaeremynck <sylvain.gaeremynck@parrot.fr>
6 * \date first release 19/12/2006
7 * \date modification 26/03/2007
10 #ifndef _THREAD_HELPER_H_
11 #define _THREAD_HELPER_H_
13 #include <VP_Os/vp_os_types.h>
14 #include <VP_Os/vp_os_thread.h>
23 # define DEFINE_CYG_THREAD void* thread;
24 # define DECLARE_CYG_THREAD 0
25 # define STACK_ALIGNMENT
27 #define BEGIN_THREAD_TABLE \
28 thread_table_entry_t threadTable[] = {
30 #define END_THREAD_TABLE \
34 #define THREAD_TABLE_ENTRY(name, priority) \
35 { #name, priority, 0, 0, NO_PARAM, thread_##name, 0, DECLARE_CYG_THREAD },
37 #define THREAD_TABLE_ENTRY_STACK(name, priority) \
38 { #name, priority, sizeof stack_##name, stack_##name, NO_PARAM, thread_##name, 0, DECLARE_CYG_THREAD },
40 #define THREAD_TABLE_ENTRY_STACK_PARAM(name, priority, params) \
41 { #name, priority, sizeof stack_##name, stack_##name, params, thread_##name, 0, DECLARE_CYG_THREAD },
43 #define DEFINE_THREAD_ROUTINE_STACK(name,params,stackSize) \
44 int8_t stack_##name[stackSize] STACK_ALIGNMENT; \
45 DEFINE_THREAD_ROUTINE(name,params)
47 #define PROTO_THREAD_ROUTINE(name,params) \
48 DEFINE_THREAD_ROUTINE(name,params)
50 #define PROTO_THREAD_ROUTINE_STACK(name,params,stackSize) \
51 extern int8_t stack_##name[stackSize]; \
52 DEFINE_THREAD_ROUTINE(name,params)
54 #define start_all_threads() vp_api_start_all_threads_tab(threadTable)
55 #define get_thread_idx(name) vp_api_get_thread_idx_tab_by_name(threadTable, name)
56 #define start_thread(idx, param) vp_api_start_thread_tab(threadTable, idx, param)
57 #define join_thread(idx) vp_api_join_thread_tab(threadTable, idx)
58 #define change_thread_prio(idx, priority) vp_api_change_thread_prio_tab(threadTable, idx, priority)
59 #define resume_thread(idx) vp_api_resume_thread(threadTable, idx)
60 #define suspend_thread(idx) vp_api_suspend_thread(threadTable, idx)
61 #define suspend_all_threads(h) vp_api_suspend_all_threads_tab(threadTable, h)
62 #define get_thread_handle(idx) vp_api_get_thread_handle(threadTable, idx)
64 #define START_THREAD(name,param) start_thread(get_thread_idx(#name), param)
66 #define JOIN_THREAD(name) join_thread(get_thread_idx(#name))
68 #define CHANGE_THREAD_PRIO(name, priority) change_thread_prio(get_thread_idx(#name), priority)
70 #define GET_THREAD_HANDLE(name) get_thread_handle(get_thread_idx(#name))
72 #define RESUME_THREAD(name) resume_thread(get_thread_idx(#name))
74 #define SUSPEND_THREAD(name) suspend_thread(get_thread_idx(#name))
84 THREAD_PARAMS parameters;
85 THREAD_ROUTINE routine;
88 } thread_table_entry_t;
90 extern thread_table_entry_t threadTable[];
92 C_RESULT vp_api_start_all_threads_tab(thread_table_entry_t* tab);
93 int32_t vp_api_get_thread_idx_tab_by_name(thread_table_entry_t* tab, const char* name);
94 int32_t vp_api_get_thread_idx_tab_by_handle(thread_table_entry_t* tab, THREAD_HANDLE handle, int32_t ret_on_failure);
95 C_RESULT vp_api_start_thread_tab(thread_table_entry_t* tab, int32_t idx, THREAD_PARAMS parameters);
96 C_RESULT vp_api_join_thread_tab(thread_table_entry_t* tab, int32_t idx);
97 C_RESULT vp_api_change_thread_prio_tab(thread_table_entry_t* tab, int32_t idx, int32_t priority);
98 C_RESULT vp_api_resume_thread(thread_table_entry_t* tab, int32_t idx);
99 C_RESULT vp_api_suspend_thread(thread_table_entry_t* tab, int32_t idx);
100 THREAD_HANDLE vp_api_get_thread_handle(thread_table_entry_t* tab, int32_t idx);
102 // Suspend all threads but the one passed as second parameters (if it's an application thread)
103 C_RESULT vp_api_suspend_all_threads_tab(thread_table_entry_t* tab, THREAD_HANDLE handle);
109 #endif // _THREAD_HELPER_H_