aboutsummaryrefslogtreecommitdiff
path: root/nanosec.c
diff options
context:
space:
mode:
authorrodri <rgl@antares-labs.eu>2024-12-07 17:19:48 +0000
committerrodri <rgl@antares-labs.eu>2024-12-07 17:19:48 +0000
commit2d161e298d7e0605fac08e574f2a03fbd49e58e0 (patch)
tree153cf203d25a35a25924b81e909e34e99574e412 /nanosec.c
parent37d05fdf63f641e657387d97a6044b02c02dbbf4 (diff)
downloadrcfitness-2d161e298d7e0605fac08e574f2a03fbd49e58e0.tar.gz
rcfitness-2d161e298d7e0605fac08e574f2a03fbd49e58e0.tar.bz2
rcfitness-2d161e298d7e0605fac08e574f2a03fbd49e58e0.zip
new tool: chrono (wip)
Diffstat (limited to 'nanosec.c')
-rw-r--r--nanosec.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/nanosec.c b/nanosec.c
new file mode 100644
index 0000000..1301e9f
--- /dev/null
+++ b/nanosec.c
@@ -0,0 +1,38 @@
+#include <u.h>
+#include <libc.h>
+#include <tos.h>
+
+/*
+ * nsec() is wallclock and can be adjusted by timesync
+ * so need to use cycles() instead, but fall back to
+ * nsec() in case we can't
+ */
+uvlong
+nanosec(void)
+{
+ static uvlong fasthz, xstart;
+ uvlong x, div;
+
+ if(fasthz == ~0ULL)
+ return nsec() - xstart;
+
+ if(fasthz == 0){
+ if(_tos->cyclefreq){
+ cycles(&xstart);
+ fasthz = _tos->cyclefreq;
+ } else {
+ xstart = nsec();
+ fasthz = ~0ULL;
+ fprint(2, "cyclefreq not available, falling back to nsec()\n");
+ fprint(2, "you might want to disable aux/timesync\n");
+ return 0;
+ }
+ }
+ cycles(&x);
+ x -= xstart;
+
+ /* this is ugly */
+ for(div = 1000000000ULL; x < 0x1999999999999999ULL && div > 1 ; div /= 10ULL, x *= 10ULL);
+
+ return x / (fasthz / div);
+}