Select Git revision
exception_itm_raw.rs 1.15 KiB
//! Overriding an exception handler
//!
//! You can override an exception handler using the [`#[exception]`][1] attribute.
//!
//! [1]: https://rust-embedded.github.io/cortex-m-rt/0.6.1/cortex_m_rt_macros/fn.exception.html
//!
#![no_main]
#![no_std]
use panic_halt as _;
use cortex_m::peripheral::{syst::SystClkSource, ITM};
use cortex_m::{iprint, iprintln, Peripherals};
use cortex_m_rt::{entry, exception};
#[entry]
fn main() -> ! {
let mut p = Peripherals::take().unwrap();
let mut syst = p.SYST;
let stim = &mut p.ITM.stim[0];
iprintln!(stim, "exception_itm_raw");
// configures the system timer to trigger a SysTick exception every second
syst.set_clock_source(SystClkSource::Core);
syst.set_reload(16_000_000); // period = 1s
syst.enable_counter();
syst.enable_interrupt();
loop {
continue;
}
}
#[exception]
fn SysTick() {
// here we access `ITM` using a *raw* pointer
// this is unsafe, as there may be other tasks accessing the peripheral
// simultaneously (and that might cause a conflict/race)
let itm = unsafe { &mut *ITM::ptr() };
let stim = &mut itm.stim[0];
iprint!(stim, ".");
}