Main Page   Data Structures   File List   Data Fields   Globals  

tbx_timing.h

00001 #ifndef TBX_TIMING_H
00002 #define TBX_TIMING_H
00003 
00004 #include <sys/types.h>
00005 #include <sys/time.h>
00006 
00007 /*
00008  * For the user interested in High resolution timer, to my knowledge 
00009  * the best library is "RTAI", unfortunately it works only on Linux OS
00010  */
00011 
00012 
00013 typedef union u_tbx_tick
00014 {
00015   unsigned long long tick;
00016 
00017   struct
00018   {
00019     unsigned long low;
00020     unsigned long high;
00021   } sub;
00022 
00023   struct timeval timev;
00024 } tbx_tick_t, *p_tbx_tick_t;
00025 
00026 #if defined(SCS_TYPECPU_ITANIUM)
00027 #define TBX_GET_TICK(t) \
00028    __asm__ __volatile__("mov %0=ar.itc" : "=r"((t).tick) :: "memory")
00029 #define TBX_TICK_RAW_DIFF(t1, t2) \
00030    ((t2).tick - (t1).tick)
00031 
00032 /* Hum hum... Here we suppose that X86ARCH => Pentium! */
00033 #elif defined(SCS_TYPECPU_X86)
00034 #define TBX_GET_TICK(t) \
00035    __asm__ volatile("cpuid; rdtsc" : "=a" ((t).sub.low), "=d" ((t).sub.high))
00036 #define TBX_TICK_RAW_DIFF(t1, t2) \
00037    ((t2).tick - (t1).tick)
00038 
00039 #elif defined(SCS_TYPECPU_ALPHA)
00040 #define TBX_GET_TICK(t) \
00041    __asm__ volatile("rpcc %0\n\t" : "=r"((t).tick))
00042 #define TBX_TICK_RAW_DIFF(t1, t2) \
00043    (((t2).tick & 0xFFFFFFFF) - ((t1).tick & 0xFFFFFFFF))
00044 
00045 #elif defined(SCS_TYPECPU_SPARC)
00046 #define TBX_GET_TICK(t) \
00047     (t).tick = gethrtime()
00048 #define TBX_TICK_RAW_DIFF(t1, t2) \
00049    ((t2).tick  - (t1).tick)
00050 /*
00051 The following instructions are done only for ppc 601 (which is an old processor!)
00052 #elif defined(SCS_TYPECPU_POWERPC)
00053 #define TBX_GET_TICK(t) \
00054    __asm__ volatile("li %0,64;mtspr UMMCR0,%0;mfspr %0,UPMC1": "=r"((t).sub.low))
00055 #define TBX_TICK_RAW_DIFF(t1, t2) \
00056    ((t2).tick  - (t1).tick)
00057 
00058 
00059 The following one is extracted from Motorola reference manual for 32 bits PPCs.
00060 But apparently it give randomly numbers, may be the clock generator is a random generator !
00061 Silly processor !!!!
00062 
00063 #elif defined(SCS_TYPECPU_POWERPC)
00064 #define TBX_GET_TICK(t) \
00065  {unsigned long chk; \
00066    __asm__ volatile("0: mftbu %0; mftb %1; mftbu %2; cmpw %2, %0; bne 0b" \
00067                     : "=r" ((t).sub.low), "=r" ((t).sub.high), "=r" (chk) );}
00068 */ 
00069 #define TBX_TICK_RAW_DIFF(t1, t2) \
00070    ((t2).tick  - (t1).tick)
00071 
00072 #else
00073 #define TBX_GET_TICK(t) \
00074    gettimeofday(&(t).timev, 0)
00075 #define TBX_TICK_RAW_DIFF(t1, t2) \
00076    ((t2.timev.tv_sec * 1000000L + t2.timev.tv_usec) - \
00077     (t1.timev.tv_sec * 1000000L + t1.timev.tv_usec))
00078 
00079 #endif
00080 
00081 #define TBX_TICK_DIFF(t1, t2) (TBX_TICK_RAW_DIFF(t1, t2) - tbx_residual + 1)
00082 #define TBX_TIMING_DELAY(t1, t2) tbx_tick2usec(TBX_TICK_DIFF(t1, t2))
00083 
00084 extern unsigned long long tbx_residual;
00085 extern tbx_tick_t         tbx_new_event;
00086 extern tbx_tick_t         tbx_last_event;
00087 
00088 #endif /* TBX_TIMING_H */

Generated on Tue Jun 17 10:15:51 2003 for SCSLib by doxygen1.2.15