48 lines
1.0 KiB
Rust
48 lines
1.0 KiB
Rust
//! Overriding an exception handler
|
|
//!
|
|
//! You can override an exception handler using the [`exception!`][1] macro.
|
|
//!
|
|
//! [1]: https://docs.rs/cortex-m-rt/0.3.2/cortex_m_rt/macro.exception.html
|
|
//!
|
|
//! The default exception handler can be overridden using the
|
|
//! [`default_handler!`][2] macro
|
|
//!
|
|
//! [2]: https://docs.rs/cortex-m-rt/0.3.2/cortex_m_rt/macro.default_handler.html
|
|
//!
|
|
//! ---
|
|
|
|
#![feature(used)]
|
|
#![no_std]
|
|
|
|
extern crate cortex_m;
|
|
#[macro_use(exception)]
|
|
extern crate cortex_m_rt;
|
|
|
|
use core::ptr;
|
|
|
|
use cortex_m::asm;
|
|
|
|
fn main() {
|
|
unsafe {
|
|
// Invalid memory access
|
|
ptr::read_volatile(0x2FFF_FFFF as *const u32);
|
|
}
|
|
}
|
|
|
|
exception!(HARD_FAULT, handler);
|
|
|
|
fn handler() {
|
|
// You'll hit this breakpoint rather than the one in cortex-m-rt
|
|
asm::bkpt()
|
|
}
|
|
|
|
// As we are not using interrupts, we just register a dummy catch all handler
|
|
#[allow(dead_code)]
|
|
#[used]
|
|
#[link_section = ".vector_table.interrupts"]
|
|
static INTERRUPTS: [extern "C" fn(); 240] = [default_handler; 240];
|
|
|
|
extern "C" fn default_handler() {
|
|
asm::bkpt();
|
|
}
|