-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtime.rs
40 lines (36 loc) · 1016 Bytes
/
time.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
use core::arch::asm;
use crate::config;
pub const TICKS_PER_SEC: usize = 100;
/// Return current time measured by ticks, which is NOT divided by frequency.
pub fn get_time() -> usize {
let mut counter: usize;
unsafe {
asm!(
"rdtime.d {},{}",
out(reg)counter,
out(reg)_,
);
}
counter
}
#[inline(always)]
pub fn get_clock_freq() -> usize {
unsafe { super::config::CLOCK_FREQ }
}
pub fn get_timer_freq_first_time() {
// 获取时钟晶振频率
// 配置信息字index:4
let base_freq = config::CPUCfg4::read().get_bits(0, 31);
// 获取时钟倍频因子
// 配置信息字index:5 位:0-15
let cfg5 = config::CPUCfg5::read();
let mul = cfg5.get_bits(0, 15);
let div = cfg5.get_bits(16, 31);
// 计算时钟频率
let cc_freq = base_freq * mul / div;
println!(
"[get_timer_freq_first_time] clk freq: {}(from CPUCFG)",
cc_freq
);
unsafe { super::config::CLOCK_FREQ = cc_freq as usize }
}