sparreal_kernel/os/time/
mod.rs1use 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
13pub 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}