rustubs/machine/time.rs
1//! system level timer
2
3use core::sync::atomic::{AtomicU64, Ordering};
4// using PIT: this is not really accurate
5// 64 bit nanosecond timer takes hundreds of years to wrap around.
6pub static HW_NS: AtomicU64 = AtomicU64::new(0);
7// TODO remove hardcode
8pub static HW_INCREMENT: u64 = 19999708;
9
10// call this in the timer interrupt prologue
11pub fn tick() -> u64 { HW_NS.fetch_add(HW_INCREMENT, Ordering::Relaxed) }
12
13pub fn sec() -> u64 {
14 let ns = HW_NS.load(Ordering::Relaxed);
15 ns / 1_000_000_000
16}
17
18pub fn msec() -> u64 {
19 let ns = HW_NS.load(Ordering::Relaxed);
20 ns / 1_000_000
21}
22
23pub fn nsec() -> u64 { HW_NS.load(Ordering::Relaxed) }