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(ln)          container_of(ln, RT_TASK, link)
00124 
00125     xnthread_t thread_base;
00126 
00127     char rname[XNOBJECT_NAME_LEN]; /* !< Name in registry. Not the same as
00128                                       thread name for anonymous threads. */
00129     int suspend_depth;
00130 
00131     int overrun;
00132 
00133     xnsynch_t safesynch; /* !< Safe synchronization object. */
00134 
00135     u_long safelock;     /* !< Safe lock count. */
00136 
00137     u_long cstamp;      /* !< Creation stamp. */
00138 
00139     xnarch_cpumask_t affinity;
00140 
00141     union { /* Saved args for current synch. wait operation. */
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; /* Send area. */
00158             RT_TASK_MCB mcb_r; /* Reply area. */
00159         } mps;
00160 #endif /* CONFIG_XENO_OPT_NATIVE_MPS */
00161 
00162     } wait_args;
00163 
00164 #ifdef CONFIG_XENO_OPT_NATIVE_MPS
00165     xnsynch_t mrecv,
00166               msendq;
00167 
00168     int flowgen;                /* !< Flow id. generator. */
00169 #endif /* CONFIG_XENO_OPT_NATIVE_MPS */
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 /* Public kernel interface */
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 /* !(__KERNEL__ || __XENO_SIM__) */
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 /* __KERNEL__ || __XENO_SIM__ */
00239 
00240 #ifdef __cplusplus
00241 extern "C" {
00242 #endif
00243 
00244 /* Public interface */
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 /* !_XENO_TASK_H */

Generated on Sun Dec 9 10:37:17 2007 for Xenomai API by  doxygen 1.5.3