1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#![no_std]
#![cfg(target_os = "none")]
#![doc(html_logo_url = "https://knurling.ferrous-systems.com/knurling_logo_light_text.svg")]
#[cfg(not(cortex_m))]
compile_error!("`panic-probe` only supports Cortex-M targets (thumbvN-none-eabi[hf])");
#[cfg(target_os = "none")]
mod imp {
use core::panic::PanicInfo;
use core::sync::atomic::{AtomicBool, Ordering};
use cortex_m::asm;
#[cfg(feature = "print-rtt")]
use crate::print_rtt::print;
#[cfg(feature = "print-defmt")]
use crate::print_defmt::print;
#[cfg(not(any(feature = "print-rtt", feature = "print-defmt")))]
fn print(_: &core::panic::PanicInfo) {}
#[panic_handler]
fn panic(info: &PanicInfo) -> ! {
static PANICKED: AtomicBool = AtomicBool::new(false);
cortex_m::interrupt::disable();
if PANICKED.load(Ordering::Relaxed) {
loop {
asm::bkpt();
}
}
PANICKED.store(true, Ordering::Relaxed);
print(info);
#[cfg(not(any(armv6m, armv8m_base)))]
{
const SHCSR: *mut u32 = 0xE000ED24usize as _;
const USGFAULTENA: usize = 18;
unsafe {
let mut shcsr = core::ptr::read_volatile(SHCSR);
shcsr &= !(1 << USGFAULTENA);
core::ptr::write_volatile(SHCSR, shcsr);
}
}
asm::udf();
}
}
#[cfg(feature = "print-rtt")]
mod print_rtt {
use core::panic::PanicInfo;
use rtt_target::rprintln;
pub fn print(info: &PanicInfo) {
rprintln!("{}", info);
}
}
#[cfg(feature = "print-defmt")]
mod print_defmt {
use core::panic::PanicInfo;
pub fn print(info: &PanicInfo) {
defmt::error!("{}", defmt::Display2Format(info));
}
}