00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 
00037  
00038  
00039 #define OROBLD_OS_LXRT_INTERNAL
00040 #include "os/fosi.h"
00041 
00042 #ifdef OROBLD_OS_AGNOSTIC
00043 
00044 
00045 
00046 TIME_SPEC ticks2timespec(RTIME hrt)
00047 {
00048         TIME_SPEC timevl;
00049         timevl.tv_sec = nano2count(hrt) / 1000000000LL;
00050         timevl.tv_nsec = nano2count(hrt) % 1000000000LL;
00051         return timevl;
00052 }
00053 
00054 
00055 #ifdef OROSEM_OS_LXRT_CHECK
00056 #define CHK_LXRT_CALL() do { if(rt_buddy() == 0) { \
00057         printf("LXRT NOT INITIALISED IN THIS THREAD pid=%d,\n\
00058     BUT TRIES TO INVOKE LXRT FUNCTION >>%s<< ANYWAY\n", getpid(), __FUNCTION__ );\
00059         assert( rt_buddy() != 0 ); }\
00060         } while(0)
00061 #define CHK_LXRT_PTR(ptr) do { if(ptr == 0) { \
00062         printf("TRIED TO PASS NULL POINTER TO LXRT IN THREAD pid=%d,\n\
00063     IN TRYING TO INVOKE LXRT FUNCTION >>%s<<\n", getpid(), __FUNCTION__ );\
00064         assert( ptr != 0 ); }\
00065         } while(0)
00066 #else
00067 #define CHK_LXRT_CALL()
00068 #define CHK_LXRT_PTR( a )
00069 #endif
00070 
00071     
00072 NANO_TIME rtos_get_time_ns(void) { return rt_get_time_ns(); }
00073 
00074 TICK_TIME rtos_get_time_ticks(void) { return rt_get_time(); }
00075 
00076 TICK_TIME ticksPerSec(void) { return nano2count( 1000 * 1000 * 1000 ); }
00077 
00078 TICK_TIME nano2ticks(NANO_TIME t) { return nano2count(t); }
00079 
00080 NANO_TIME ticks2nano(TICK_TIME t) { return count2nano(t); }
00081 
00082 
00083 int rtos_nanosleep(const TIME_SPEC *rqtp, TIME_SPEC *rmtp) 
00084 {
00085     CHK_LXRT_CALL();
00086     nanosleep(rqtp,rmtp); 
00087     return 0;
00088 }
00089 
00090     int rtos_sem_init(rt_sem_t* m, int value )
00091     {
00092         CHK_LXRT_CALL();
00093                 
00094         m->sem = rt_sem_init( rt_get_name(0) , value);
00095         return m->sem == 0 ? -1 : 0;
00096     }
00097 
00098     int rtos_sem_destroy(rt_sem_t* m )
00099     {
00100         CHK_LXRT_CALL();
00101         return rt_sem_delete(m->sem);
00102     }
00103 
00104     int rtos_sem_signal(rt_sem_t* m )
00105     {
00106         CHK_LXRT_CALL();
00107         return rt_sem_signal(m->sem);
00108     }
00109 
00110     int rtos_sem_wait(rt_sem_t* m )
00111     {
00112         CHK_LXRT_CALL();
00113         return rt_sem_wait(m->sem);
00114     }
00115 
00116     int rtos_sem_trywait(rt_sem_t* m )
00117     {
00118         CHK_LXRT_CALL();
00119         return rt_sem_wait_if(m->sem);
00120     }
00121 
00122     int rtos_sem_value(rt_sem_t* m )
00123     {
00124         CHK_LXRT_CALL();
00125         return rt_sem_count(m->sem);
00126     }
00127 
00128     int rtos_sem_wait_timed(rt_sem_t* m, NANO_TIME delay )
00129     {
00130       int ret;
00131         CHK_LXRT_CALL();
00132         ret = rt_sem_wait_timed(m->sem, nano2count(delay) );
00133 #if defined(CONFIG_RTAI_VERSION_MINOR) && defined(CONFIG_RTAI_VERSION_MAJOR)
00134 #  if CONFIG_RTAI_VERSION_MAJOR == 3 && CONFIG_RTAI_VERSION_MINOR > 3
00135         return (ret == RTE_TIMOUT) ? -1 : 0;
00136 #  else
00137         return (ret == SEM_TIMOUT) ? -1 : 0;
00138 #  endif
00139 #else
00140         return (ret == SEM_TIMOUT) ? -1 : 0;
00141 #endif
00142     }
00143 
00144     int rtos_sem_wait_until(rt_sem_t* m, NANO_TIME when )
00145     {
00146         int ret;
00147         CHK_LXRT_CALL();
00148         ret = rt_sem_wait_until(m->sem, nano2count(when) ) ;
00149 #if defined(CONFIG_RTAI_VERSION_MINOR) && defined(CONFIG_RTAI_VERSION_MAJOR)
00150 #  if CONFIG_RTAI_VERSION_MAJOR == 3 && CONFIG_RTAI_VERSION_MINOR > 3
00151         return (ret == RTE_TIMOUT) ? -1 : 0;
00152 #  else
00153         return (ret == SEM_TIMOUT) ? -1 : 0;
00154 #  endif
00155 #else
00156         return (ret == SEM_TIMOUT) ? -1 : 0;
00157 #endif
00158     }
00159 
00160     int rtos_mutex_init(rt_mutex_t* m)
00161     {
00162         CHK_LXRT_CALL();
00163         m->sem = rt_typed_sem_init( rt_get_name(0),1, BIN_SEM | PRIO_Q);
00164         return m->sem == 0 ? -1 : 0;
00165     }
00166 
00167     int rtos_mutex_destroy(rt_mutex_t* m )
00168     {
00169         CHK_LXRT_CALL();
00170         CHK_LXRT_PTR(m);
00171         return rt_sem_delete(m->sem);
00172     }
00173 
00174     int rtos_mutex_rec_init(rt_mutex_t* m)
00175     {
00176         CHK_LXRT_CALL();
00177         
00178         m->sem = rt_typed_sem_init( rt_get_name(0), 1, RES_SEM);
00179         return m->sem == 0 ? -1 : 0;
00180     }
00181 
00182     int rtos_mutex_rec_destroy(rt_mutex_t* m )
00183     {
00184         CHK_LXRT_CALL();
00185         CHK_LXRT_PTR(m->sem);
00186         return rt_sem_delete(m->sem);
00187     }
00188 
00189     int rtos_mutex_rec_lock( rt_rec_mutex_t* m)
00190     {
00191         CHK_LXRT_CALL();
00192         return rt_sem_wait(m->sem);
00193     }
00194 
00195     int rtos_mutex_rec_trylock( rt_rec_mutex_t* m)
00196     {
00197         CHK_LXRT_CALL();
00198         return rt_sem_wait_if(m->sem) > 0 ? 0 : -EAGAIN;
00199     }
00200 
00201     int rtos_mutex_lock_until( rt_mutex_t* m, NANO_TIME abs_time)
00202     {
00203         CHK_LXRT_CALL();
00204         return rt_sem_wait_until(m->sem, nano2count(abs_time)) < SEM_TIMOUT ? 0 : -EAGAIN;
00205     }
00206 
00207     int rtos_mutex_rec_lock_until( rt_rec_mutex_t* m, NANO_TIME abs_time)
00208     {
00209         CHK_LXRT_CALL();
00210         return rt_sem_wait_until(m->sem, nano2count(abs_time)) < SEM_TIMOUT ? 0 : -EAGAIN;
00211     }
00212 
00213     int rtos_mutex_rec_unlock( rt_rec_mutex_t* m)
00214     {
00215         CHK_LXRT_CALL();
00216         return rt_sem_signal(m->sem);
00217     }
00218 
00219     int rtos_mutex_lock( rt_mutex_t* m)
00220     {
00221         CHK_LXRT_CALL();
00222         CHK_LXRT_PTR(m->sem);
00223         return rt_sem_wait(m->sem);
00224     }
00225 
00226     int rtos_mutex_trylock( rt_mutex_t* m)
00227     {
00228         CHK_LXRT_CALL();
00229         CHK_LXRT_PTR(m->sem);
00230         return rt_sem_wait_if(m->sem) > 0 ? 0 : -EAGAIN;
00231     }
00232 
00233     int rtos_mutex_unlock( rt_mutex_t* m)
00234     {
00235         CHK_LXRT_CALL();
00236         CHK_LXRT_PTR(m->sem);
00237         return rt_sem_signal(m->sem);
00238     }
00239 
00240     int rtos_cond_init(rt_cond_t *cond)
00241     {
00242         CHK_LXRT_CALL();
00243         cond->cond = rt_cond_init(0);
00244         return cond->cond == 0 ? -1 : 0;
00245     }
00246 
00247     int rtos_cond_destroy(rt_cond_t *cond)
00248     {
00249         CHK_LXRT_CALL();
00250         return rt_cond_delete(cond->cond);
00251     }
00252 
00253     int rtos_cond_wait(rt_cond_t *cond, rt_mutex_t *mutex)
00254     {
00255         CHK_LXRT_CALL();
00256         int ret = rt_cond_wait(cond->cond, mutex->sem );
00257         if (ret == 0)
00258             return 0;
00259         return -1;
00260     }
00261 
00262     int rtos_cond_timedwait(rt_cond_t *cond, rt_mutex_t *mutex, NANO_TIME abs_time)
00263     {
00264         CHK_LXRT_CALL();
00265         int ret = rt_cond_wait_until(cond->cond, mutex->sem, nano2count(abs_time) );
00266         if (ret == 0)
00267             return 0;
00268         if ( ret == SEM_TIMOUT )
00269             return ETIMEDOUT;
00270         return -1;
00271     }
00272 
00273     int rtos_cond_broadcast(rt_cond_t *cond)
00274     {
00275         CHK_LXRT_CALL();
00276         return rt_cond_broadcast(cond->cond);
00277     }
00278 
00279 int rtos_printf(const char *fmt, ...)
00280 {
00281     va_list list;
00282     char printkbuf [2000];
00283     printkbuf[0] = '\0';
00284     va_start (list, fmt);
00285     vsprintf(printkbuf, fmt, list);
00286     va_end (list);
00287     
00288     return rtai_print_to_screen(printkbuf);
00289     
00290 }
00291 
00292 #endif // OROBLD_OS_AGNOSTIC
00293