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(ln) container_of(ln, RT_TASK, link)
00124
00125 xnthread_t thread_base;
00126
00127 char rname[XNOBJECT_NAME_LEN];
00128
00129 int suspend_depth;
00130
00131 int overrun;
00132
00133 xnsynch_t safesynch;
00134
00135 u_long safelock;
00136
00137 u_long cstamp;
00138
00139 xnarch_cpumask_t affinity;
00140
00141 union {
00142
00143 struct {
00144 int mode;
00145 unsigned long mask;
00146 } event;
00147
00148 struct rt_queue_msg *qmsg;
00149
00150 struct {
00151 size_t size;
00152 void *block;
00153 } heap;
00154
00155 #ifdef CONFIG_XENO_OPT_NATIVE_MPS
00156 struct {
00157 RT_TASK_MCB mcb_s;
00158 RT_TASK_MCB mcb_r;
00159 } mps;
00160 #endif
00161
00162 } wait_args;
00163
00164 #ifdef CONFIG_XENO_OPT_NATIVE_MPS
00165 xnsynch_t mrecv,
00166 msendq;
00167
00168 int flowgen;
00169 #endif
00170
00171 } RT_TASK;
00172
00173 static inline RT_TASK *thread2rtask (xnthread_t *t)
00174 {
00175 return t ? container_of(t, RT_TASK, thread_base) : NULL;
00176 }
00177
00178 #define xeno_current_task() thread2rtask(xnpod_current_thread())
00179
00180 #ifdef __cplusplus
00181 extern "C" {
00182 #endif
00183
00184 void __native_task_safe(RT_TASK *task);
00185
00186 void __native_task_unsafe(RT_TASK *task);
00187
00188 int __native_task_safewait(RT_TASK *task);
00189
00190 int __native_task_pkg_init(void);
00191
00192 void __native_task_pkg_cleanup(void);
00193
00194
00195
00196 int rt_task_add_hook(int type,
00197 void (*routine)(void *cookie));
00198
00199 int rt_task_remove_hook(int type,
00200 void (*routine)(void *cookie));
00201
00202 int rt_task_catch(void (*handler)(rt_sigset_t));
00203
00204 #ifdef __cplusplus
00205 }
00206 #endif
00207
00208 #else
00209
00210 typedef RT_TASK_PLACEHOLDER RT_TASK;
00211
00212 #ifdef __cplusplus
00213 extern "C" {
00214 #endif
00215
00216 int rt_task_shadow(RT_TASK *task,
00217 const char *name,
00218 int prio,
00219 int mode);
00220
00221 int rt_task_bind(RT_TASK *task,
00222 const char *name,
00223 RTIME timeout);
00224
00225 static inline int rt_task_unbind (RT_TASK *task)
00226
00227 {
00228 task->opaque = XN_NO_HANDLE;
00229 return 0;
00230 }
00231
00232 int rt_task_join(RT_TASK *task);
00233
00234 #ifdef __cplusplus
00235 }
00236 #endif
00237
00238 #endif
00239
00240 #ifdef __cplusplus
00241 extern "C" {
00242 #endif
00243
00244
00245
00246 int rt_task_create(RT_TASK *task,
00247 const char *name,
00248 int stksize,
00249 int prio,
00250 int mode);
00251
00252 int rt_task_start(RT_TASK *task,
00253 void (*fun)(void *cookie),
00254 void *cookie);
00255
00256 int rt_task_suspend(RT_TASK *task);
00257
00258 int rt_task_resume(RT_TASK *task);
00259
00260 int rt_task_delete(RT_TASK *task);
00261
00262 int rt_task_yield(void);
00263
00264 int rt_task_set_periodic(RT_TASK *task,
00265 RTIME idate,
00266 RTIME period);
00267
00268 int rt_task_wait_period(unsigned long *overruns_r);
00269
00270 int rt_task_set_priority(RT_TASK *task,
00271 int prio);
00272
00273 int rt_task_sleep(RTIME delay);
00274
00275 int rt_task_sleep_until(RTIME date);
00276
00277 int rt_task_unblock(RT_TASK *task);
00278
00279 int rt_task_inquire(RT_TASK *task,
00280 RT_TASK_INFO *info);
00281
00282 int rt_task_notify(RT_TASK *task,
00283 rt_sigset_t signals);
00284
00285 int rt_task_set_mode(int clrmask,
00286 int setmask,
00287 int *mode_r);
00288
00289 RT_TASK *rt_task_self(void);
00290
00291 int rt_task_slice(RT_TASK *task,
00292 RTIME quantum);
00293
00294 ssize_t rt_task_send(RT_TASK *task,
00295 RT_TASK_MCB *mcb_s,
00296 RT_TASK_MCB *mcb_r,
00297 RTIME timeout);
00298
00299 int rt_task_receive(RT_TASK_MCB *mcb_r,
00300 RTIME timeout);
00301
00302 int rt_task_reply(int flowid,
00303 RT_TASK_MCB *mcb_s);
00304
00305 static inline int rt_task_spawn(RT_TASK *task,
00306 const char *name,
00307 int stksize,
00308 int prio,
00309 int mode,
00310 void (*entry)(void *cookie),
00311 void *cookie)
00312 {
00313 int err = rt_task_create(task,name,stksize,prio,mode);
00314
00315 if (!err)
00316 err = rt_task_start(task,entry,cookie);
00317
00318 return err;
00319 }
00320
00321 #ifdef __cplusplus
00322 }
00323 #endif
00324
00325 #endif