From 3d48137c00511b3f2d35511482d1a76f8d06382d Mon Sep 17 00:00:00 2001 From: root Date: Fri, 26 Feb 2021 12:12:38 +0000 Subject: works --- app/sysclk.c | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 app/sysclk.c (limited to 'app/sysclk.c') diff --git a/app/sysclk.c b/app/sysclk.c new file mode 100644 index 0000000..1847c28 --- /dev/null +++ b/app/sysclk.c @@ -0,0 +1,81 @@ +#include "project.h" + + + +static Event_ring sysclk_ring; + +void sysclk_event (void) +{ + uint32_t refclk_now = HW_CLOCK_REG; + uint32_t sysclk_now = SCS_DWT_CYCCNT; + + + sysclk_ring.events[sysclk_ring.tx_ptr].when = refclk_now; + sysclk_ring.events[sysclk_ring.tx_ptr].value = sysclk_now; + sysclk_ring.tx_ptr = (sysclk_ring.tx_ptr + 1) & ERING_MASK; + +} + +static uint32_t high_tick; + +#define QUARTER (1UL << 29) +#define HALF (1UL << 30) +#define THREE_QUARTERS (HALF+QUARTER) +#define ONE (~(uint32_t)0) + +uint64_t sysclk_extend (uint32_t now) +{ + static int m; + uint64_t ret; + + + if (!m) { + ret = high_tick; + ret <<= 32; + ret |= now; + + + if ((now > THREE_QUARTERS) && (now <= ONE)) { + high_tick++; + m = 1; + } + + } else { + if (now < HALF) { + ret = high_tick; + ret <<= 32; + ret |= now; + } else { + ret = high_tick - 1; + ret <<= 32; + ret |= now; + } + + if ((now > QUARTER) && (now < HALF)) + m = 0; + } + + return ret; +} +void sysclk_dispatch (void) +{ + //char buf[80]; + uint64_t refclk_abs; + uint32_t refclk_now, sysclk_now; + EPOCH e; + //UTC u; + + if (sysclk_ring.rx_ptr == sysclk_ring.tx_ptr) return; + + sysclk_now = sysclk_ring.events[sysclk_ring.rx_ptr].value; + refclk_now = sysclk_ring.events[sysclk_ring.rx_ptr].when; + sysclk_ring.rx_ptr = (sysclk_ring.rx_ptr + 1) & ERING_MASK; + + refclk_abs = abs_extend (refclk_now); + e.s = sysclk_extend (sysclk_now); + e.ns = 0; + + report_time ("SYS", e, refclk_abs, ""); +} + + -- cgit v1.2.3