refactor: move exception handler to new module
This commit is contained in:
parent
0f3a5f6b32
commit
cb53f81662
2 changed files with 41 additions and 39 deletions
39
src/hardfaults.rs
Normal file
39
src/hardfaults.rs
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
use cortex_m_rt::ExceptionFrame;
|
||||||
|
|
||||||
|
fn display_ef(ef: &ExceptionFrame) {
|
||||||
|
struct Wrapper(ExceptionFrame);
|
||||||
|
impl defmt::Format for Wrapper {
|
||||||
|
fn format(&self, fmt: defmt::Formatter) {
|
||||||
|
defmt::write!(
|
||||||
|
fmt,
|
||||||
|
"ExceptionFrame(\n\tr0: {:08x}\n\tr1: {:08x}\n\tr2: {:08x}\n\tr3: {:08x}\n\tr12: {:08x}\n\tlr: {:08x}\n\tpc: {:08x}\n\txpsr: {:08x}\n)",
|
||||||
|
self.0.r0(),
|
||||||
|
self.0.r1(),
|
||||||
|
self.0.r2(),
|
||||||
|
self.0.r3(),
|
||||||
|
self.0.r12(),
|
||||||
|
self.0.lr(),
|
||||||
|
self.0.pc(),
|
||||||
|
self.0.xpsr()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
error!("HardFault: Exception occured!");
|
||||||
|
error!("Exception occured at: {:08x}", ef.pc());
|
||||||
|
error!("XSPR: {:032b}", ef.xpsr());
|
||||||
|
error!("LR: {:08x}", ef.lr());
|
||||||
|
|
||||||
|
error!("HardFault: {:#?}", Wrapper(*ef))
|
||||||
|
}
|
||||||
|
|
||||||
|
#[allow(unreachable_code)]
|
||||||
|
#[cortex_m_rt::exception(trampoline = true)]
|
||||||
|
unsafe fn HardFault(ef: &ExceptionFrame) -> ! {
|
||||||
|
static mut EXCEPTION: Option<ExceptionFrame> = None;
|
||||||
|
unsafe { EXCEPTION = Some(*ef) };
|
||||||
|
|
||||||
|
display_ef(ef);
|
||||||
|
#[allow(clippy::empty_loop)]
|
||||||
|
loop {}
|
||||||
|
}
|
41
src/main.rs
41
src/main.rs
|
@ -11,6 +11,8 @@ use defmt_rtt as _; // global logger
|
||||||
use cortex_m_rt::{ExceptionFrame, entry};
|
use cortex_m_rt::{ExceptionFrame, entry};
|
||||||
use hal::{pac, prelude::*, rcc::Config};
|
use hal::{pac, prelude::*, rcc::Config};
|
||||||
|
|
||||||
|
mod hardfaults; // defines a handler for evil hardfaults
|
||||||
|
|
||||||
// same panicking *behavior* as `panic-probe` but doesn't print a panic message
|
// same panicking *behavior* as `panic-probe` but doesn't print a panic message
|
||||||
// this prevents the panic message being printed *twice* when `defmt::panic` is invoked
|
// this prevents the panic message being printed *twice* when `defmt::panic` is invoked
|
||||||
#[defmt::panic_handler]
|
#[defmt::panic_handler]
|
||||||
|
@ -38,7 +40,6 @@ fn main() -> ! {
|
||||||
// Get the delay provider.
|
// Get the delay provider.
|
||||||
let mut delay = cp.SYST.delay(rcc.clocks);
|
let mut delay = cp.SYST.delay(rcc.clocks);
|
||||||
|
|
||||||
// BUG: this program seems to completely halt whenever a C function is called.
|
|
||||||
debug!("Asserting that libalgorithms is correctly loaded");
|
debug!("Asserting that libalgorithms is correctly loaded");
|
||||||
assert!(algorithms::ffi_is_loaded(), "ffi is not loaded?");
|
assert!(algorithms::ffi_is_loaded(), "ffi is not loaded?");
|
||||||
|
|
||||||
|
@ -62,41 +63,3 @@ fn main() -> ! {
|
||||||
delay.delay_ms(500_u16);
|
delay.delay_ms(500_u16);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn display_ef(ef: &ExceptionFrame) {
|
|
||||||
struct Wrapper(ExceptionFrame);
|
|
||||||
impl defmt::Format for Wrapper {
|
|
||||||
fn format(&self, fmt: defmt::Formatter) {
|
|
||||||
defmt::write!(
|
|
||||||
fmt,
|
|
||||||
"ExceptionFrame(\n\tr0: {:08x}\n\tr1: {:08x}\n\tr2: {:08x}\n\tr3: {:08x}\n\tr12: {:08x}\n\tlr: {:08x}\n\tpc: {:08x}\n\txpsr: {:08x}\n)",
|
|
||||||
self.0.r0(),
|
|
||||||
self.0.r1(),
|
|
||||||
self.0.r2(),
|
|
||||||
self.0.r3(),
|
|
||||||
self.0.r12(),
|
|
||||||
self.0.lr(),
|
|
||||||
self.0.pc(),
|
|
||||||
self.0.xpsr()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
error!("HardFault: Exception occured!");
|
|
||||||
error!("Exception occured at: {:08x}", ef.pc());
|
|
||||||
error!("XSPR: {:032b}", ef.xpsr());
|
|
||||||
error!("LR: {:08x}", ef.lr());
|
|
||||||
|
|
||||||
error!("HardFault: {:#?}", Wrapper(*ef))
|
|
||||||
}
|
|
||||||
|
|
||||||
#[allow(unreachable_code)]
|
|
||||||
#[cortex_m_rt::exception(trampoline = true)]
|
|
||||||
unsafe fn HardFault(ef: &ExceptionFrame) -> ! {
|
|
||||||
static mut EXCEPTION: Option<ExceptionFrame> = None;
|
|
||||||
unsafe { EXCEPTION = Some(*ef) };
|
|
||||||
|
|
||||||
display_ef(ef);
|
|
||||||
#[allow(clippy::empty_loop)]
|
|
||||||
loop {}
|
|
||||||
}
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue