use core::sync::atomic::{AtomicBool, Ordering};
use cortex_m::peripheral::{DCB, DWT};
static DWT_USABLE: AtomicBool = AtomicBool::new(false);
pub fn init() {
unsafe {
(*DCB::PTR).demcr.modify(|w| w | (1 << 24)); (*DWT::PTR).lar.write(0xC5AC_CE55); (*DWT::PTR).cyccnt.write(0);
(*DWT::PTR).ctrl.modify(|w| w | 1); }
for _ in 0..8 {
cortex_m::asm::nop();
}
let advanced = DWT::cycle_count() != 0;
DWT_USABLE.store(advanced, Ordering::Release);
}
pub fn cycle_count() -> u64 {
if DWT_USABLE.load(Ordering::Acquire) {
return DWT::cycle_count() as u64;
}
#[cfg(feature = "systick")]
{
super::systick::now_micros()
}
#[cfg(not(feature = "systick"))]
{
0
}
}