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
---
 cpukit/score/src/kern_tc.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/cpukit/score/src/kern_tc.c b/cpukit/score/src/kern_tc.c
index 0aa0fdd393..95ae01b5b4 100644
--- a/cpukit/score/src/kern_tc.c
+++ b/cpukit/score/src/kern_tc.c
@@ -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
-- 
2.35.3

_______________________________________________
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel

Reply via email to