From 303c9f183f8456edea52ab17f513f4acc8a2df4c Mon Sep 17 00:00:00 2001 From: Matt Knight Date: Thu, 7 Jul 2022 21:38:40 -0700 Subject: [PATCH] add busy sleep functions --- src/hal.zig | 1 + src/hal/time.zig | 44 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 src/hal/time.zig diff --git a/src/hal.zig b/src/hal.zig index ae181da..1a793b1 100644 --- a/src/hal.zig +++ b/src/hal.zig @@ -3,6 +3,7 @@ const regs = microzig.chip.regsisters; pub const gpio = @import("hal/gpio.zig"); pub const clocks = @import("hal/clocks.zig"); pub const multicore = @import("hal/multicore.zig"); +pub const time = @import("hal/time.zig"); pub const default_clock_config = clocks.GlobalConfiguration.init(.{ //.ref = .{ .source = .src_xosc }, diff --git a/src/hal/time.zig b/src/hal/time.zig new file mode 100644 index 0000000..2ed49ae --- /dev/null +++ b/src/hal/time.zig @@ -0,0 +1,44 @@ +const microzig = @import("microzig"); +const TIMER = microzig.chip.registers.TIMER; + +pub const Absolute = struct { + us_since_boot: u64, +}; + +pub fn getTimeSinceBoot() Absolute { + var high_word = TIMER.TIMERAWH.*; + + return while (true) { + var low_word = TIMER.TIMERAWL.*; + const next_high_word = TIMER.TIMERAWH.*; + if (next_high_word == high_word) + break Absolute{ + .us_since_boot = @intCast(u64, high_word) << 32 | low_word, + }; + + high_word = next_high_word; + } else unreachable; +} + +pub fn makeTimeoutUs(timeout_us: u64) Absolute { + return Absolute{ + .us_since_boot = getTimeSinceBoot().us_since_boot + timeout_us, + }; +} + +pub fn reached(time: Absolute) bool { + const now = getTimeSinceBoot(); + return now.us_since_boot >= time.us_since_boot; +} + +pub fn sleepMs(time_ms: u32) void { + sleepUs(time_ms * 1000); +} + +pub fn sleepUs(time_us: u64) void { + const end_time = Absolute{ + .us_since_boot = time_us + getTimeSinceBoot().us_since_boot, + }; + + while (!reached(end_time)) {} +}