#[cfg(not(feature = "rp2040"))]
pub const TICK_DIVIDER: u32 = 64; #[cfg(feature = "rp2040")]
pub const TICK_DIVIDER : u32 = 1;
const _: () = assert!(
TICK_DIVIDER % 2 == 0 || TICK_DIVIDER == 1,
"TICK_DIVIDER must be even for better optimization"
);
#[unsafe(no_mangle)]
pub fn get_tracing_time_us() -> u32 {
let t: u32;
#[cfg(target_arch = "xtensa")]
unsafe {
core::arch::asm!("rsr.ccount {0}", out(reg) t)
};
#[cfg(target_arch = "riscv32")]
unsafe {
core::arch::asm!("csrr {0}, mcycle", out(reg) t);
}
embassy_time::Instant::now().as_micros() as u32
}
#[unsafe(no_mangle)]
pub fn get_system_time_us() -> u64 {
embassy_time::Instant::now().as_micros()
}
#[unsafe(no_mangle)]
pub fn preinit_clock_reference() {
#[cfg(any(feature = "stm32", feature = "rp235xa", feature = "rp235xb"))]
unsafe {
let mut p = cortex_m::Peripherals::steal();
p.DCB.enable_trace();
p.DWT.set_cycle_count(0);
p.DWT.enable_cycle_counter();
}
}
#[unsafe(no_mangle)]
#[allow(unreachable_code)]
pub fn get_tracing_raw_ticks() -> u32 {
#[cfg(target_arch = "xtensa")]
unsafe {
let t: u32;
core::arch::asm!("rsr.ccount {0}", out(reg) t);
return t / TICK_DIVIDER;
}
#[cfg(target_arch = "riscv32")]
unsafe {
let t: u32;
core::arch::asm!("csrr {0}, mcycle", out(reg) t);
return t / TICK_DIVIDER;
}
#[cfg(any(feature = "stm32", feature = "rp235xa", feature = "rp235xb"))]
unsafe {
return *(0xE0001004 as *const u32) / TICK_DIVIDER;
}
#[cfg(feature = "rp2040")]
unsafe {
return *(0x40054028 as *const u32) / TICK_DIVIDER;
}
panic!("Unsupported architecture for get_tracing_raw_ticks()");
return embassy_time::Instant::now().as_ticks() as u32 / TICK_DIVIDER;
}