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
00057
#define T_FPU XNFPU
00058
00059
#define T_CPU(id) ((id) & 0xff)
00060
00061
00062
#define T_BLOCKED XNPEND
00063
#define T_DELAYED XNDELAY
00064
#define T_READY XNREADY
00065
#define T_DORMANT XNDORMANT
00066
#define T_STARTED XNSTARTED
00067
#define T_BOOST XNBOOST
00068
#define T_LOCK XNLOCK
00069
#define T_RRB XNRRB
00070
00071
00072
#define RT_HOOK_TSTART XNHOOK_THREAD_START
00073
#define RT_HOOK_TSWITCH XNHOOK_THREAD_SWITCH
00074
#define RT_HOOK_TDELETE XNHOOK_THREAD_DELETE
00075
#define RT_HOOK_TASKPTR(cookie) thread2rtask(cookie)
00076
00077
00078
#define T_HIPRIO FUSION_LOW_PRI
00079
#define T_LOPRIO FUSION_HIGH_PRI
00080
#define rtprio2xn(rtprio) (FUSION_HIGH_PRI - (rtprio) + 1)
00081
#define xnprio2rt(xnprio) (T_LOPRIO + (xnprio) - 1)
00082
00083
typedef struct rt_task_placeholder {
00084 rt_handle_t opaque;
00085 } RT_TASK_PLACEHOLDER;
00086
00087
#define RT_TASK_STATUS_MASK \
00088
(T_FPU|T_BLOCKED|T_DELAYED|T_READY|T_DORMANT|T_STARTED|T_BOOST|T_LOCK|T_RRB)
00089
00090
typedef struct rt_task_info {
00091
00092
int bprio;
00093
int cprio;
00094
unsigned status;
00095 RTIME relpoint;
00096
00097
char name[XNOBJECT_NAME_LEN];
00098
00099 } RT_TASK_INFO;
00100
00101
#if defined(__KERNEL__) || defined(__RTAI_SIM__)
00102
00103
#define RTAI_TASK_MAGIC 0x55550101
00104
00105
typedef struct rt_task {
00106
00107
unsigned magic;
00108
00109 xnholder_t link;
00110
00111 xntimer_t timer;
00112
00113
#define link2rtask(laddr) \
00114
((RT_TASK *)(((char *)laddr) - (int)(&((RT_TASK *)0)->link)))
00115
00116 xnthread_t thread_base;
00117
00118
#define thread2rtask(taddr) \
00119
((taddr) ? ((RT_TASK *)(((char *)(taddr)) - (int)(&((RT_TASK *)0)->thread_base))) : NULL)
00120
00121 rt_handle_t handle;
00122
00123
int suspend_depth;
00124
00125
int overrun;
00126
00127
union {
00128
00129
struct {
00130
int mode;
00131
unsigned long mask;
00132 } event;
00133
00134 } wait_args;
00135
00136 } RT_TASK;
00137
00138
#define rtai_current_task() thread2rtask(xnpod_current_thread())
00139
00140
#ifdef __cplusplus
00141
extern "C" {
00142
#endif
00143
00144
int __task_pkg_init(
void);
00145
00146
void __task_pkg_cleanup(
void);
00147
00148
00149
00150
int rt_task_add_hook(
int type,
00151
void (*routine)(
void *cookie));
00152
00153
#ifdef __cplusplus
00154
}
00155
#endif
00156
00157
#else
00158
00159
typedef RT_TASK_PLACEHOLDER RT_TASK;
00160
00161
int rt_task_bind(RT_TASK *task,
00162
const char *name);
00163
00164
#endif
00165
00166
#ifdef __cplusplus
00167
extern "C" {
00168
#endif
00169
00170
00171
00172
int rt_task_create(RT_TASK *task,
00173
const char *name,
00174
int stksize,
00175
int prio,
00176
int mode);
00177
00178
int rt_task_start(RT_TASK *task,
00179
void (*fun)(
void *cookie),
00180
void *cookie);
00181
00182
int rt_task_suspend(RT_TASK *task);
00183
00184
int rt_task_resume(RT_TASK *task);
00185
00186
int rt_task_delete(RT_TASK *task);
00187
00188
int rt_task_yield(
void);
00189
00190
int rt_task_set_periodic(RT_TASK *task,
00191 RTIME idate,
00192 RTIME period);
00193
00194
int rt_task_wait_period(
void);
00195
00196
int rt_task_set_priority(RT_TASK *task,
00197
int prio);
00198
00199
int rt_task_sleep(RTIME delay);
00200
00201
int rt_task_sleep_until(RTIME date);
00202
00203
int rt_task_unblock(RT_TASK *task);
00204
00205
int rt_task_inquire (RT_TASK *task,
00206 RT_TASK_INFO *info);
00207
00208
#ifdef __cplusplus
00209
}
00210
#endif
00211
00212
#endif