include/native/task.h

Go to the documentation of this file.
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 /* Creation flags. */
00031 #define T_FPU     XNFPU
00032 #define T_SUSP    XNSUSP
00033 /* <!> High bits must not conflict with XNFPU|XNSHADOW|XNSHIELD|XNSUSP. */
00034 #define T_CPU(cpu) (1 << (24 + (cpu & 7))) /* Up to 8 cpus [0-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   /* Recycle internal bits status which */
00057 #define T_JOINABLE 0x00000400   /* won't be passed to the nucleus.  */
00058  /* Ends doxygen-group native_task_status */
00059 
00060 /* Task hook types. */
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 /* Priority range (POSIXish, same bounds as Xenomai's). */
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;   /* !< Magic code - must be first */
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]; /* !< Name in registry. Not the same as
00129                                       thread name for anonymous threads. */
00130     int suspend_depth;
00131 
00132     int overrun;
00133 
00134     xnsynch_t safesynch; /* !< Safe synchronization object. */
00135 
00136     u_long safelock;     /* !< Safe lock count. */
00137 
00138     u_long cstamp;      /* !< Creation stamp. */
00139 
00140     xnarch_cpumask_t affinity;
00141 
00142     union { /* Saved args for current synch. wait operation. */
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; /* Send area. */
00159             RT_TASK_MCB mcb_r; /* Reply area. */
00160         } mps;
00161 #endif /* CONFIG_XENO_OPT_NATIVE_MPS */
00162 
00163     } wait_args;
00164 
00165 #ifdef CONFIG_XENO_OPT_NATIVE_MPS
00166     xnsynch_t mrecv,
00167               msendq;
00168 
00169     int flowgen;                /* !< Flow id. generator. */
00170 #endif /* CONFIG_XENO_OPT_NATIVE_MPS */
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 /* Public kernel interface */
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 /* !(__KERNEL__ || __XENO_SIM__) */
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 /* __KERNEL__ || __XENO_SIM__ */
00240 
00241 #ifdef __cplusplus
00242 extern "C" {
00243 #endif
00244 
00245 /* Public interface */
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 /* !_XENO_TASK_H */

Generated on Mon Dec 25 13:57:10 2006 for Xenomai API by  doxygen 1.4.6