00001
00022 #ifndef _XENO_TASK_H
00023 #define _XENO_TASK_H
00024
00025 #include <nucleus/core.h>
00026 #include <nucleus/thread.h>
00027 #include <nucleus/synch.h>
00028 #include <native/timer.h>
00029
00030
00031 #define T_FPU XNFPU
00032 #define T_SUSP XNSUSP
00033
00034 #define T_CPU(cpu) (1 << (24 + (cpu & 7)))
00035 #define T_CPUMASK 0xff000000
00036
00044 #define T_BLOCKED XNPEND
00045 #define T_DELAYED XNDELAY
00046 #define T_READY XNREADY
00047 #define T_DORMANT XNDORMANT
00048 #define T_STARTED XNSTARTED
00049 #define T_BOOST XNBOOST
00050 #define T_LOCK XNLOCK
00051 #define T_RRB XNRRB
00052 #define T_NOSIG XNASDI
00053 #define T_SHIELD XNSHIELD
00054 #define T_WARNSW XNTRAPSW
00055 #define T_RPIOFF XNRPIOFF
00056 #define T_PRIMARY 0x00000200
00057 #define T_JOINABLE 0x00000400
00058
00059
00060
00061 #define T_HOOK_START XNHOOK_THREAD_START
00062 #define T_HOOK_SWITCH XNHOOK_THREAD_SWITCH
00063 #define T_HOOK_DELETE XNHOOK_THREAD_DELETE
00064 #define T_DESC(cookie) thread2rtask(cookie)
00065
00066
00067 #define T_LOPRIO XNCORE_LOW_PRIO
00068 #define T_HIPRIO XNCORE_HIGH_PRIO
00069
00070 typedef struct rt_task_placeholder {
00071 xnhandle_t opaque;
00072 unsigned long opaque2;
00073 } RT_TASK_PLACEHOLDER;
00074
00075 struct rt_queue_msg;
00076 struct rt_task;
00077
00082 typedef struct rt_task_info {
00083
00084 int bprio;
00086 int cprio;
00088 unsigned status;
00090 RTIME relpoint;
00092 char name[XNOBJECT_NAME_LEN];
00094 } RT_TASK_INFO;
00095
00096 #define RT_MCB_FSTORE_LIMIT 64
00097
00101 typedef struct rt_task_mcb {
00102
00103 int flowid;
00105 int opcode;
00107 caddr_t data;
00109 size_t size;
00111 } RT_TASK_MCB;
00112
00113 #if defined(__KERNEL__) || defined(__XENO_SIM__)
00114
00115 #define XENO_TASK_MAGIC 0x55550101
00116
00117 typedef struct rt_task {
00118
00119 unsigned magic;
00120
00121 xnholder_t link;
00122
00123 #define link2rtask(laddr) \
00124 ((RT_TASK *)(((char *)laddr) - (int)(&((RT_TASK *)0)->link)))
00125
00126 xnthread_t thread_base;
00127
00128 char rname[XNOBJECT_NAME_LEN];
00129
00130 int suspend_depth;
00131
00132 int overrun;
00133
00134 xnsynch_t safesynch;
00135
00136 u_long safelock;
00137
00138 u_long cstamp;
00139
00140 xnarch_cpumask_t affinity;
00141
00142 union {
00143
00144 struct {
00145 int mode;
00146 unsigned long mask;
00147 } event;
00148
00149 struct rt_queue_msg *qmsg;
00150
00151 struct {
00152 size_t size;
00153 void *block;
00154 } heap;
00155
00156 #ifdef CONFIG_XENO_OPT_NATIVE_MPS
00157 struct {
00158 RT_TASK_MCB mcb_s;
00159 RT_TASK_MCB mcb_r;
00160 } mps;
00161 #endif
00162
00163 } wait_args;
00164
00165 #ifdef CONFIG_XENO_OPT_NATIVE_MPS
00166 xnsynch_t mrecv,
00167 msendq;
00168
00169 int flowgen;
00170 #endif
00171
00172 } RT_TASK;
00173
00174 static inline RT_TASK *thread2rtask (xnthread_t *t)
00175 {
00176 return t ? ((RT_TASK *)(((char *)(t)) - (int)(&((RT_TASK *)0)->thread_base))) : NULL;
00177 }
00178
00179 #define xeno_current_task() thread2rtask(xnpod_current_thread())
00180
00181 #ifdef __cplusplus
00182 extern "C" {
00183 #endif
00184
00185 void __native_task_safe(RT_TASK *task);
00186
00187 void __native_task_unsafe(RT_TASK *task);
00188
00189 int __native_task_safewait(RT_TASK *task);
00190
00191 int __native_task_pkg_init(void);
00192
00193 void __native_task_pkg_cleanup(void);
00194
00195
00196
00197 int rt_task_add_hook(int type,
00198 void (*routine)(void *cookie));
00199
00200 int rt_task_remove_hook(int type,
00201 void (*routine)(void *cookie));
00202
00203 int rt_task_catch(void (*handler)(rt_sigset_t));
00204
00205 #ifdef __cplusplus
00206 }
00207 #endif
00208
00209 #else
00210
00211 typedef RT_TASK_PLACEHOLDER RT_TASK;
00212
00213 #ifdef __cplusplus
00214 extern "C" {
00215 #endif
00216
00217 int rt_task_shadow(RT_TASK *task,
00218 const char *name,
00219 int prio,
00220 int mode);
00221
00222 int rt_task_bind(RT_TASK *task,
00223 const char *name,
00224 RTIME timeout);
00225
00226 static inline int rt_task_unbind (RT_TASK *task)
00227
00228 {
00229 task->opaque = XN_NO_HANDLE;
00230 return 0;
00231 }
00232
00233 int rt_task_join(RT_TASK *task);
00234
00235 #ifdef __cplusplus
00236 }
00237 #endif
00238
00239 #endif
00240
00241 #ifdef __cplusplus
00242 extern "C" {
00243 #endif
00244
00245
00246
00247 int rt_task_create(RT_TASK *task,
00248 const char *name,
00249 int stksize,
00250 int prio,
00251 int mode);
00252
00253 int rt_task_start(RT_TASK *task,
00254 void (*fun)(void *cookie),
00255 void *cookie);
00256
00257 int rt_task_suspend(RT_TASK *task);
00258
00259 int rt_task_resume(RT_TASK *task);
00260
00261 int rt_task_delete(RT_TASK *task);
00262
00263 int rt_task_yield(void);
00264
00265 int rt_task_set_periodic(RT_TASK *task,
00266 RTIME idate,
00267 RTIME period);
00268
00269 int rt_task_wait_period(unsigned long *overruns_r);
00270
00271 int rt_task_set_priority(RT_TASK *task,
00272 int prio);
00273
00274 int rt_task_sleep(RTIME delay);
00275
00276 int rt_task_sleep_until(RTIME date);
00277
00278 int rt_task_unblock(RT_TASK *task);
00279
00280 int rt_task_inquire(RT_TASK *task,
00281 RT_TASK_INFO *info);
00282
00283 int rt_task_notify(RT_TASK *task,
00284 rt_sigset_t signals);
00285
00286 int rt_task_set_mode(int clrmask,
00287 int setmask,
00288 int *mode_r);
00289
00290 RT_TASK *rt_task_self(void);
00291
00292 int rt_task_slice(RT_TASK *task,
00293 RTIME quantum);
00294
00295 ssize_t rt_task_send(RT_TASK *task,
00296 RT_TASK_MCB *mcb_s,
00297 RT_TASK_MCB *mcb_r,
00298 RTIME timeout);
00299
00300 int rt_task_receive(RT_TASK_MCB *mcb_r,
00301 RTIME timeout);
00302
00303 int rt_task_reply(int flowid,
00304 RT_TASK_MCB *mcb_s);
00305
00306 static inline int rt_task_spawn(RT_TASK *task,
00307 const char *name,
00308 int stksize,
00309 int prio,
00310 int mode,
00311 void (*entry)(void *cookie),
00312 void *cookie)
00313 {
00314 int err = rt_task_create(task,name,stksize,prio,mode);
00315
00316 if (!err)
00317 err = rt_task_start(task,entry,cookie);
00318
00319 return err;
00320 }
00321
00322 #ifdef __cplusplus
00323 }
00324 #endif
00325
00326 #endif