task.h

Go to the documentation of this file.
00001 
00049 #ifndef _RTAI_TASK_H
00050 #define _RTAI_TASK_H
00051 
00052 #include <nucleus/fusion.h>
00053 #include <nucleus/thread.h>
00054 #include <rtai/timer.h>
00055 
00056 /* Creation flags. */
00057 #define T_FPU     XNFPU
00058 #define T_SUSP    XNSUSP
00059 /* <!> High bits must not conflict with XNFPU|XNSHADOW|XNSUSP. */
00060 #define T_CPU(cpu) (1 << (24 + (cpu & 0xff))) /* Up to 8 cpus [0-7] */
00061 
00062 /* Status flags. */
00063 #define T_BLOCKED XNPEND
00064 #define T_DELAYED XNDELAY
00065 #define T_READY   XNREADY
00066 #define T_DORMANT XNDORMANT
00067 #define T_STARTED XNSTARTED
00068 #define T_BOOST   XNBOOST
00069 #define T_LOCK    XNLOCK
00070 #define T_RRB     XNRRB
00071 #define T_NOSIG   XNASDI
00072 
00073 /* Task hook types. */
00074 #define T_HOOK_START  XNHOOK_THREAD_START
00075 #define T_HOOK_SWITCH XNHOOK_THREAD_SWITCH
00076 #define T_HOOK_DELETE XNHOOK_THREAD_DELETE
00077 #define T_HOOK_DESC(cookie) thread2rtask(cookie)
00078 
00079 /* Priority range (same bounds as fusion, but reversed). */
00080 #define T_HIPRIO  FUSION_LOW_PRIO
00081 #define T_LOPRIO  FUSION_HIGH_PRIO
00082 #define rtprio2xn(rtprio) (FUSION_HIGH_PRIO - (rtprio) + 1)
00083 #define xnprio2rt(xnprio) (T_LOPRIO + (xnprio) - 1)
00084 
00085 typedef struct rt_task_placeholder {
00086     rt_handle_t opaque;
00087 } RT_TASK_PLACEHOLDER;
00088 
00089 #define RT_TASK_STATUS_MASK \
00090 (T_FPU|T_BLOCKED|T_DELAYED|T_READY|T_DORMANT|T_STARTED|T_BOOST|T_LOCK|T_RRB)
00091 
00092 struct rt_queue_msg;
00093 
00094 typedef struct rt_task_info {
00095 
00096     int bprio;                  /* !< Base priority. */
00097 
00098     int cprio;                  /* !< Current priority. */
00099 
00100     unsigned status;            /* !< Status. */
00101 
00102     RTIME relpoint;             /* !< Periodic release point. */
00103 
00104     char name[XNOBJECT_NAME_LEN]; /* !< Symbolic name. */
00105 
00106 } RT_TASK_INFO;
00107 
00108 #if defined(__KERNEL__) || defined(__RTAI_SIM__)
00109 
00110 #define RTAI_TASK_MAGIC 0x55550101
00111 
00112 typedef struct rt_task {
00113 
00114     unsigned magic;   /* !< Magic code - must be first */
00115 
00116     xnholder_t link;
00117 
00118     xntimer_t timer;
00119 
00120 #define link2rtask(laddr) \
00121 ((RT_TASK *)(((char *)laddr) - (int)(&((RT_TASK *)0)->link)))
00122 
00123     xnthread_t thread_base;
00124 
00125 #define thread2rtask(taddr) \
00126 ((taddr) ? ((RT_TASK *)(((char *)(taddr)) - (int)(&((RT_TASK *)0)->thread_base))) : NULL)
00127 
00128     rt_handle_t handle; /* !< Handle in registry -- zero if unregistered. */
00129 
00130     int suspend_depth;
00131 
00132     int overrun;
00133 
00134     xnarch_cpumask_t affinity;
00135 
00136     union { /* Saved args for current synch. wait operation. */
00137 
00138         struct {
00139             int mode;
00140             unsigned long mask;
00141         } event;
00142 
00143         struct rt_queue_msg *qmsg;
00144 
00145         struct {
00146             size_t size;
00147             void *block;
00148         } heap;
00149 
00150     } wait_args;
00151 
00152 } RT_TASK;
00153 
00154 #define rtai_current_task() thread2rtask(xnpod_current_thread())
00155 
00156 #ifdef __cplusplus
00157 extern "C" {
00158 #endif
00159 
00160 int __task_pkg_init(void);
00161 
00162 void __task_pkg_cleanup(void);
00163 
00164 /* Public kernel interface */
00165 
00166 int rt_task_add_hook(int type,
00167                      void (*routine)(void *cookie));
00168 
00169 int rt_task_remove_hook(int type,
00170                         void (*routine)(void *cookie));
00171 
00172 #ifdef __cplusplus
00173 }
00174 #endif
00175 
00176 #else /* !(__KERNEL__ || __RTAI_SIM__) */
00177 
00178 typedef RT_TASK_PLACEHOLDER RT_TASK;
00179 
00180 int rt_task_bind(RT_TASK *task,
00181                  const char *name);
00182 
00183 static inline int rt_task_unbind (RT_TASK *task)
00184 
00185 {
00186     task->opaque = RT_HANDLE_INVALID;
00187     return 0;
00188 }
00189 
00190 #endif /* __KERNEL__ || __RTAI_SIM__ */
00191 
00192 #ifdef __cplusplus
00193 extern "C" {
00194 #endif
00195 
00196 /* Public interface */
00197 
00198 int rt_task_create(RT_TASK *task,
00199                    const char *name,
00200                    int stksize,
00201                    int prio,
00202                    int mode);
00203 
00204 int rt_task_start(RT_TASK *task,
00205                   void (*fun)(void *cookie),
00206                   void *cookie);
00207 
00208 int rt_task_suspend(RT_TASK *task);
00209 
00210 int rt_task_resume(RT_TASK *task);
00211 
00212 int rt_task_delete(RT_TASK *task);
00213 
00214 int rt_task_yield(void);
00215 
00216 int rt_task_set_periodic(RT_TASK *task,
00217                          RTIME idate,
00218                          RTIME period);
00219 
00220 int rt_task_wait_period(void);
00221 
00222 int rt_task_set_priority(RT_TASK *task,
00223                          int prio);
00224 
00225 int rt_task_sleep(RTIME delay);
00226 
00227 int rt_task_sleep_until(RTIME date);
00228 
00229 int rt_task_unblock(RT_TASK *task);
00230 
00231 int rt_task_inquire(RT_TASK *task,
00232                      RT_TASK_INFO *info);
00233 
00234 int rt_task_catch(void (*handler)(rt_sigset_t));
00235 
00236 int rt_task_notify(RT_TASK *task,
00237                    rt_sigset_t signals);
00238 
00239 int rt_task_set_mode(int clrmask,
00240                      int setmask,
00241                      int *mode_r);
00242 
00243 RT_TASK *rt_task_self(void);
00244 
00245 int rt_task_slice(RT_TASK *task,
00246                   RTIME quantum);
00247 
00248 #ifdef __cplusplus
00249 }
00250 #endif
00251 
00252 #endif /* !_RTAI_TASK_H */

Generated on Mon Dec 13 09:49:49 2004 for RTAI API by  doxygen 1.3.9.1