Skip to main content

sparreal_kernel/os/time/
mod.rs

1use core::time::Duration;
2
3mod timer;
4
5pub use timer::{TimerError, TimerHandle, one_shot_after, one_shot_at, time_list};
6
7pub(crate) fn init() {
8    crate::hal::al::cpu::systick_irq_disable();
9    crate::hal::al::cpu::systick_enable();
10    timer::init();
11}
12
13/// Time since the timer subsystem was initialised.
14pub fn since_boot() -> Duration {
15    let ticks = crate::hal::al::cpu::systick_ticks();
16    ticks_to_duration(ticks)
17}
18
19pub fn ticks() -> usize {
20    crate::hal::al::cpu::systick_ticks()
21}
22
23fn ticks_to_duration(ticks: usize) -> Duration {
24    let freq = crate::hal::al::cpu::systick_frequency();
25    let secs = ticks / freq;
26    let nanos = ((ticks % freq) as u128 * 1_000_000_000u128) / (freq as u128);
27    Duration::new(secs as u64, nanos as u32)
28}
29
30fn duration_to_ticks(dur: Duration) -> usize {
31    let freq = crate::hal::al::cpu::systick_frequency();
32    let secs_ticks = dur.as_secs().saturating_mul(freq as u64) as usize;
33    let nanos_ticks = (dur.subsec_nanos() as u128 * (freq as u128)) / 1_000_000_000u128;
34    secs_ticks.saturating_add(nanos_ticks as usize)
35}