diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2023-02-27 14:49:10 -0700 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2023-03-07 07:30:44 +0100 |
commit | d5c386ff99933c2e71e2119b395cd0470a772a0b (patch) | |
tree | 9bbec1e6c6a18aa434437d9955d64cec7e3f67d6 /cpukit/score | |
parent | pps: Simplify the nsec calculation in pps_event() (diff) | |
download | rtems-d5c386ff99933c2e71e2119b395cd0470a772a0b.tar.bz2 |
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
Diffstat (limited to 'cpukit/score')
-rw-r--r-- | cpukit/score/src/kern_tc.c | 4 |
1 files changed, 3 insertions, 1 deletions
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 |