pps: Round to closest integer in pps_event()

The comment above bintime2timespec() says:

  When converting between timestamps on parallel timescales of differing
  resolutions it is historical and scientific practice to round down.

However, the delta_nsec value is a time difference and not a timestamp.  Also
the rounding errors accumulate in the frequency accumulator, see hardpps().
So, rounding to the closest integer is probably slightly better.

Reviewed by: imp
Pull Request: https://github.com/freebsd/freebsd-src/pull/604
This commit is contained in:
Sebastian Huber
2023-03-07 07:30:44 +01:00
parent d9f5345df6
commit d5c386ff99
+3 -1
View File
@@ -2266,6 +2266,7 @@ pps_event(struct pps_state *pps, int event)
#ifdef PPS_SYNC
if (fhard) {
uint64_t delta_nsec;
uint64_t freq;
/*
* Feed the NTP PLL/FLL.
@@ -2277,7 +2278,8 @@ pps_event(struct pps_state *pps, int event)
tcount &= captc->tc_counter_mask;
delta_nsec = 1000000000;
delta_nsec *= tcount;
delta_nsec /= captc->tc_frequency;
freq = captc->tc_frequency;
delta_nsec = (delta_nsec + freq / 2) / freq;
hardpps(tsp, (long)delta_nsec);
}
#endif