GLAST / LAT > DAQ and FSW > FSW > Doxygen Index> PBS / dev > pbs / rad750
#include <PBS/PTS.h>
Defines | |
#define | PTS_GETS() |
Macro to get the short range of the processor time. | |
#define | PTS_GETX() |
Macro to get the full extended range of the processor time. | |
#define | PTS_PTUS_TO_NSECS(_ptus) PTS_ptus_to_nsecs (_ptus) |
Converts a short range processor time to nanoseconds. | |
#define | PTS_NSECS_TO_PTUS(_nsecs) PTS_nsecs_to_ptus (_nsecs) |
Converts a short range nanoseconds to a processor time. | |
#define | PTS_PTUX_TO_NSECX(_ptux) PTS_ptux_to_nsecx (_ptux) |
Converts a extended range processor time to nanocseconds. | |
#define | PTS_NSECX_TO_PTUX(_nsecx) PTS_nsecx_to_ptux (_nsecx) |
Converts an extended range nanoseconds to a processor time. | |
#define | PTS_DELTAS(_beg, _end) ((_end) - (_beg)) |
Subtracts two short range processor times. | |
#define | PTS_DELTAS_IN_NSECS(_beg, _end) |
Subtracts two short range processor times and converts the difference to nanoseconds. | |
#define | PTS_DELTAX(_beg, _end) ((_end) - (_beg)) |
Subtracts two extended range processor times. | |
#define | PTS_DELTAX_IN_NSECX(_beg, _end) |
Subtracts two extended range processor times and converts the difference to nanoseconds (64 bit result). | |
Typedefs | |
typedef unsigned long long | PTS_timex |
The typedef for declaring extended range processor time variables. | |
typedef unsigned int | PTS_times |
The typedef for declaring short range processor time variables. |
CVS $Id: PTS.h.xx-ppc-gcc,v 1.7 2011/03/24 23:05:45 apw Exp $
This is PPC implementation of the PTS facility. The implementation is based on PPC time register. The implementation also depends on the GCC compiler, since it uses the GCC asm facility to access this register. Because this routine tries to accurately time very short events (>.5usecs) it must be implemented with very low overhead, Therefore, the implementatin is fairly simple minded resulting in a limitation of this not being able to time long events. The definition of long is ~ 2**32*60nsecs = ~257 secs. If you are timing things that long, the normal system clock may be a better choice.
#define PTS_DELTAS | ( | _beg, | |||
_end | ) | ((_end) - (_beg)) |
Subtracts two short range processor times.
_beg | The beginning time | |
_end | The ending time |
#define PTS_DELTAS_IN_NSECS | ( | _beg, | |||
_end | ) |
Value:
PTS_PTUS_TO_NSECS(PTS_DELTAS(_beg,\ _end))
_beg | The beginning time | |
_end | The ending time |
#define PTS_DELTAX | ( | _beg, | |||
_end | ) | ((_end) - (_beg)) |
Subtracts two extended range processor times.
_beg | The beginning time | |
_end | The ending time |
#define PTS_DELTAX_IN_NSECX | ( | _beg, | |||
_end | ) |
Value:
PTS_PTUX_TO_NSECX(PTS_DELTAX(_beg, \ _end))
_beg | The beginning time | |
_end | The ending time |
#define PTS_GETS | ( | ) |
Value:
({ \ unsigned int tbl; \ asm volatile ("mftb %0": "=r"(tbl)); \ tbl; \ })
PTS_GETS() gets the short range of the processor time. This is is generally a 32-bit value, however, the exact representation is platform dependent. The user should use the typedef PTS_times to declare an short range processor time variable.
This is implemented as a macro because its only value is to act as a low overhead method of timing short duration fragments of code. If one is timing long durations (where long is a platform dependent definition, but generally means greater than one second) PTS_GETX() is more appropriate.
Referenced by PBS_initialize2(), wct__diff_aticks(), wct__get(), wct__update(), WCT_announce(), and WUT_sys_handler().
#define PTS_GETX | ( | ) |
Value:
({ \ union \ { \ struct { unsigned int hi; unsigned int lo; } ui; \ unsigned long long ull; \ } ll; \ unsigned int tbl, tbh, tbh_i; \ asm volatile ("mftbu %0": "=r"(tbh_i)); \ while (1) \ { \ asm volatile ("mftb %0 \n" \ "mftbu %1 \n" \ : "=r"(tbl), "=r"(tbh)); \ if (tbh == tbh_i) break; \ tbh_i = tbh; \ } \ ll.ui.hi = tbh; \ ll.ui.lo = tbl; \ ll.ull;} ) \
PTS_GETX() gets the full extended range of the processor time. This is is generally a 64-bit value, however, the exact representation is platform dependent. The user should use the typedef PTS_timex to declare an extended range processor time variable.
This is implemented as a macro because its only value is to act as a low overhead method of timing short duration fragments of code. See PTS_GETS() for the short version of getting the processor time. If one is timing short code segments (where short is a platform dependent definition, but generally means subsecond), PTS_GETS() is lower overhead. Be aware that PTS_GETX() is just an elapsed timer, so the timing long segments of code also includes any time that may elapse due to interrupt or task switching.
Referenced by WUT_sys_handler().
#define PTS_NSECS_TO_PTUS | ( | _nsecs | ) | PTS_nsecs_to_ptus (_nsecs) |
Converts a short range nanoseconds to a processor time.
_nsecs | The short range time, in nanoseconds, to convert to a processor time. |
#define PTS_NSECX_TO_PTUX | ( | _nsecx | ) | PTS_nsecx_to_ptux (_nsecx) |
Converts an extended range nanoseconds to a processor time.
_nsecx | The extended range time, in nanoseconds, to convert to a processor time |
#define PTS_PTUS_TO_NSECS | ( | _ptus | ) | PTS_ptus_to_nsecs (_ptus) |
Converts a short range processor time to nanoseconds.
_ptus | The short range processor time to convert. This value is generally the result of a call to PTS_GETS(). |
#define PTS_PTUX_TO_NSECX | ( | _ptux | ) | PTS_ptux_to_nsecx (_ptux) |
Converts a extended range processor time to nanocseconds.
_ptux | The extended range processor time to convert. This value is generally the result of a call to PTS_GETX(). |