diff -r 003cc3c63855 -r f49e5a6b7804 doc/doxygen/html/timers__unix_8c-source.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/doxygen/html/timers__unix_8c-source.html Fri Jun 08 09:23:56 2007 +0200 @@ -0,0 +1,130 @@ + +
+00001 #include <stdlib.h> +00002 +00003 #include <sys/time.h> +00004 #include <pthread.h> +00005 #include <signal.h> +00006 +00007 #include "applicfg.h" +00008 #include "timer.h" +00009 +00010 pthread_mutex_t CanFestival_mutex = PTHREAD_MUTEX_INITIALIZER; +00011 +00012 TASK_HANDLE TimerLoopThread; +00013 +00014 TIMEVAL last_time_set = TIMEVAL_MAX; +00015 +00016 struct timeval last_sig; +00017 +00018 timer_t timer; +00019 +00020 void EnterMutex(void) +00021 { +00022 pthread_mutex_lock(&CanFestival_mutex); +00023 } +00024 +00025 void LeaveMutex(void) +00026 { +00027 pthread_mutex_unlock(&CanFestival_mutex); +00028 } +00029 +00030 void timer_notify(sigval_t val) +00031 { +00032 gettimeofday(&last_sig,NULL); +00033 EnterMutex(); +00034 TimeDispatch(); +00035 LeaveMutex(); +00036 // printf("getCurrentTime() return=%u\n", p.tv_usec); +00037 } +00038 +00039 void initTimer(void) +00040 { +00041 struct sigevent sigev; +00042 +00043 // Take first absolute time ref. +00044 gettimeofday(&last_sig,NULL); +00045 +00046 memset (&sigev, 0, sizeof (struct sigevent)); +00047 sigev.sigev_value.sival_int = 0; +00048 sigev.sigev_notify = SIGEV_THREAD; +00049 sigev.sigev_notify_attributes = NULL; +00050 sigev.sigev_notify_function = timer_notify; +00051 +00052 timer_create (CLOCK_REALTIME, &sigev, &timer); +00053 } +00054 +00055 void StopTimerLoop(void) +00056 { +00057 EnterMutex(); +00058 timer_delete (timer); +00059 LeaveMutex(); +00060 } +00061 +00062 void StartTimerLoop(TimerCallback_t init_callback) +00063 { +00064 initTimer(); +00065 EnterMutex(); +00066 // At first, TimeDispatch will call init_callback. +00067 SetAlarm(NULL, 0, init_callback, 0, 0); +00068 LeaveMutex(); +00069 } +00070 +00071 void CreateReceiveTask(CAN_PORT port, TASK_HANDLE* Thread, void* ReceiveLoopPtr) +00072 { +00073 pthread_create(Thread, NULL, ReceiveLoopPtr, (void*)port); +00074 } +00075 +00076 void WaitReceiveTaskEnd(TASK_HANDLE Thread) +00077 { +00078 pthread_kill(Thread, SIGTERM); +00079 pthread_join(Thread, NULL); +00080 } +00081 +00082 #define maxval(a,b) ((a>b)?a:b) +00083 void setTimer(TIMEVAL value) +00084 { +00085 // printf("setTimer(TIMEVAL value=%d)\n", value); +00086 // TIMEVAL is us whereas setitimer wants ns... +00087 long tv_nsec = 1000 * (maxval(value,1)%1000000); +00088 time_t tv_sec = value/1000000; +00089 struct itimerspec timerValues; +00090 timerValues.it_value.tv_sec = tv_sec; +00091 timerValues.it_value.tv_nsec = tv_nsec; +00092 timerValues.it_interval.tv_sec = 0; +00093 timerValues.it_interval.tv_nsec = 0; +00094 +00095 timer_settime (timer, 0, &timerValues, NULL); +00096 } +00097 +00098 TIMEVAL getElapsedTime(void) +00099 { +00100 struct timeval p; +00101 gettimeofday(&p,NULL); +00102 // printf("getCurrentTime() return=%u\n", p.tv_usec); +00103 return (p.tv_sec - last_sig.tv_sec)* 1000000 + p.tv_usec - last_sig.tv_usec; +00104 } +