00001
00049 #ifndef _RTAI_TASK_H
00050 #define _RTAI_TASK_H
00051
00052 #include <nucleus/fusion.h>
00053 #include <nucleus/thread.h>
00054 #include <rtai/timer.h>
00055
00056
00057 #define T_FPU XNFPU
00058 #define T_SUSP XNSUSP
00059
00060 #define T_CPU(cpu) (1 << (24 + (cpu & 0xff)))
00061
00062
00063 #define T_BLOCKED XNPEND
00064 #define T_DELAYED XNDELAY
00065 #define T_READY XNREADY
00066 #define T_DORMANT XNDORMANT
00067 #define T_STARTED XNSTARTED
00068 #define T_BOOST XNBOOST
00069 #define T_LOCK XNLOCK
00070 #define T_RRB XNRRB
00071 #define T_NOSIG XNASDI
00072
00073
00074 #define T_HOOK_START XNHOOK_THREAD_START
00075 #define T_HOOK_SWITCH XNHOOK_THREAD_SWITCH
00076 #define T_HOOK_DELETE XNHOOK_THREAD_DELETE
00077 #define T_HOOK_DESC(cookie) thread2rtask(cookie)
00078
00079
00080 #define T_HIPRIO FUSION_LOW_PRIO
00081 #define T_LOPRIO FUSION_HIGH_PRIO
00082 #define rtprio2xn(rtprio) (FUSION_HIGH_PRIO - (rtprio) + 1)
00083 #define xnprio2rt(xnprio) (T_LOPRIO + (xnprio) - 1)
00084
00085 typedef struct rt_task_placeholder {
00086 rt_handle_t opaque;
00087 } RT_TASK_PLACEHOLDER;
00088
00089 #define RT_TASK_STATUS_MASK \
00090 (T_FPU|T_BLOCKED|T_DELAYED|T_READY|T_DORMANT|T_STARTED|T_BOOST|T_LOCK|T_RRB)
00091
00092 struct rt_queue_msg;
00093
00094 typedef struct rt_task_info {
00095
00096 int bprio;
00097
00098 int cprio;
00099
00100 unsigned status;
00101
00102 RTIME relpoint;
00103
00104 char name[XNOBJECT_NAME_LEN];
00105
00106 } RT_TASK_INFO;
00107
00108 #if defined(__KERNEL__) || defined(__RTAI_SIM__)
00109
00110 #define RTAI_TASK_MAGIC 0x55550101
00111
00112 typedef struct rt_task {
00113
00114 unsigned magic;
00115
00116 xnholder_t link;
00117
00118 xntimer_t timer;
00119
00120 #define link2rtask(laddr) \
00121 ((RT_TASK *)(((char *)laddr) - (int)(&((RT_TASK *)0)->link)))
00122
00123 xnthread_t thread_base;
00124
00125 #define thread2rtask(taddr) \
00126 ((taddr) ? ((RT_TASK *)(((char *)(taddr)) - (int)(&((RT_TASK *)0)->thread_base))) : NULL)
00127
00128 rt_handle_t handle;
00129
00130 int suspend_depth;
00131
00132 int overrun;
00133
00134 xnarch_cpumask_t affinity;
00135
00136 union {
00137
00138 struct {
00139 int mode;
00140 unsigned long mask;
00141 } event;
00142
00143 struct rt_queue_msg *qmsg;
00144
00145 struct {
00146 size_t size;
00147 void *block;
00148 } heap;
00149
00150 } wait_args;
00151
00152 } RT_TASK;
00153
00154 #define rtai_current_task() thread2rtask(xnpod_current_thread())
00155
00156 #ifdef __cplusplus
00157 extern "C" {
00158 #endif
00159
00160 int __task_pkg_init(void);
00161
00162 void __task_pkg_cleanup(void);
00163
00164
00165
00166 int rt_task_add_hook(int type,
00167 void (*routine)(void *cookie));
00168
00169 int rt_task_remove_hook(int type,
00170 void (*routine)(void *cookie));
00171
00172 #ifdef __cplusplus
00173 }
00174 #endif
00175
00176 #else
00177
00178 typedef RT_TASK_PLACEHOLDER RT_TASK;
00179
00180 int rt_task_bind(RT_TASK *task,
00181 const char *name);
00182
00183 static inline int rt_task_unbind (RT_TASK *task)
00184
00185 {
00186 task->opaque = RT_HANDLE_INVALID;
00187 return 0;
00188 }
00189
00190 #endif
00191
00192 #ifdef __cplusplus
00193 extern "C" {
00194 #endif
00195
00196
00197
00198 int rt_task_create(RT_TASK *task,
00199 const char *name,
00200 int stksize,
00201 int prio,
00202 int mode);
00203
00204 int rt_task_start(RT_TASK *task,
00205 void (*fun)(void *cookie),
00206 void *cookie);
00207
00208 int rt_task_suspend(RT_TASK *task);
00209
00210 int rt_task_resume(RT_TASK *task);
00211
00212 int rt_task_delete(RT_TASK *task);
00213
00214 int rt_task_yield(void);
00215
00216 int rt_task_set_periodic(RT_TASK *task,
00217 RTIME idate,
00218 RTIME period);
00219
00220 int rt_task_wait_period(void);
00221
00222 int rt_task_set_priority(RT_TASK *task,
00223 int prio);
00224
00225 int rt_task_sleep(RTIME delay);
00226
00227 int rt_task_sleep_until(RTIME date);
00228
00229 int rt_task_unblock(RT_TASK *task);
00230
00231 int rt_task_inquire(RT_TASK *task,
00232 RT_TASK_INFO *info);
00233
00234 int rt_task_catch(void (*handler)(rt_sigset_t));
00235
00236 int rt_task_notify(RT_TASK *task,
00237 rt_sigset_t signals);
00238
00239 int rt_task_set_mode(int clrmask,
00240 int setmask,
00241 int *mode_r);
00242
00243 RT_TASK *rt_task_self(void);
00244
00245 int rt_task_slice(RT_TASK *task,
00246 RTIME quantum);
00247
00248 #ifdef __cplusplus
00249 }
00250 #endif
00251
00252 #endif