예제 #1
0
파일: clockobj.c 프로젝트: rcn-ee/xenomai-3
ticks_t clockobj_get_time(struct clockobj *clkobj)
{
	ticks_t ns = clockobj_get_tsc();

	if (clockobj_get_resolution(clkobj) > 1)
		return ns / clockobj_get_resolution(clkobj);

	return ns;
}
예제 #2
0
void __clockobj_ticks_to_timespec(struct clockobj *clkobj,
				  ticks_t ticks,
				  struct timespec *ts)
{
	unsigned int freq;

	if (clockobj_get_resolution(clkobj) > 1) {
		freq = clockobj_get_frequency(clkobj);
		ts->tv_sec = ticks / freq;
		ts->tv_nsec = ticks - (ts->tv_sec * freq);
		ts->tv_nsec *= clockobj_get_resolution(clkobj);
	} else
		clockobj_ns_to_timespec(ticks, ts);
}
예제 #3
0
void clockobj_get_time(struct clockobj *clkobj,
		       ticks_t *pticks, ticks_t *ptsc)
{
	unsigned long long ns, tsc;

	tsc = __xn_rdtsc();
	ns = cobalt_ticks_to_ns(tsc);
	if (clockobj_get_resolution(clkobj) > 1)
		ns /= clockobj_get_resolution(clkobj);
	*pticks = ns;

	if (ptsc)
		*ptsc = tsc;
}
예제 #4
0
void clockobj_get_date(struct clockobj *clkobj, ticks_t *pticks)
{
	unsigned long long ns;

	read_lock_nocancel(&clkobj->lock);

	ns = cobalt_ticks_to_ns(__xn_rdtsc());
	/* Add offset to epoch. */
	ns += (unsigned long long)clkobj->offset.tv_sec * 1000000000ULL;
	ns += clkobj->offset.tv_nsec;
	if (clockobj_get_resolution(clkobj) > 1)
		ns /= clockobj_get_resolution(clkobj);
	*pticks = ns;

	read_unlock(&clkobj->lock);
}
예제 #5
0
int sysClkRateGet(void)
{
	unsigned int resolution;
	struct service svc;

	COPPERPLATE_PROTECT(svc);
	resolution = clockobj_get_resolution(&wind_clock);
	COPPERPLATE_UNPROTECT(svc);

	return 1000000000 / resolution;
}
예제 #6
0
void clockobj_get_time(struct clockobj *clkobj, ticks_t *pticks,
		       ticks_t *ptsc)
{
	struct timespec now;

	__RT(clock_gettime(CLOCK_COPPERPLATE, &now));

	/* Convert the time value to ticks, with no offset. */
	if (clockobj_get_resolution(clkobj) > 1)
		*pticks = (ticks_t)now.tv_sec * clockobj_get_frequency(clkobj)
			+ (ticks_t)now.tv_nsec / clockobj_get_resolution(clkobj);
	else
		*pticks = timespec_scalar(&now);

	/*
	 * Mercury has a single time source, with TSC == monotonic
	 * time.
	 */
	if (ptsc)
		*ptsc = *pticks;
}
예제 #7
0
void clockobj_get_date(struct clockobj *clkobj, ticks_t *pticks)
{
	struct timespec now, date;

	read_lock_nocancel(&clkobj->lock);

	__RT(clock_gettime(CLOCK_COPPERPLATE, &now));

	/* Add offset from epoch to current system time. */
	timespec_add(&date, &clkobj->offset, &now);

	/* Convert the time value to ticks,. */
	*pticks = (ticks_t)date.tv_sec * clockobj_get_frequency(clkobj)
		+ (ticks_t)date.tv_nsec / clockobj_get_resolution(clkobj);

	read_unlock(&clkobj->lock);
}