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

Generated on Mon Mar 24 18:02:40 2008 for Xenomai API by  doxygen 1.5.3