Support formatted panic messages
#![feature(asm)]
#![feature(const_vec_new)]
#![feature(const_fn)]
+#![feature(panic_info_message)]
use cortex_m_rt::{entry, pre_init};
use embedded_hal::watchdog::WatchdogDisable; // REMOVE when embedded-hal watchdog is finalized
+extern crate alloc;
use core::panic::PanicInfo;
+use core::fmt;
use crate::serial_console::get_global_console;
use crate::console::ConsoleOutput;
use crate::util::print_dec;
#[panic_handler]
fn panic(info: &PanicInfo) -> ! {
// Boy if we panic before the console is up, we're just SOL.
- let console = get_global_console();
+ let mut console = get_global_console();
- console.write("PANIC!\r\n");
+ console.write("PANIC!\n");
- match info.payload().downcast_ref::<&str>() {
- Some(p) => console.write(p),
- None => console.write("no payload"),
- };
- console.write("\r\n");
+ if let Some(p) = info.payload().downcast_ref::<&str>() {
+ console.write(p);
+ } else if let Some(m) = info.message() {
+ match fmt::write(&mut console, *m) {
+ Ok(_) => (),
+ Err(_) => console.write("Error formatting panic message"),
+ };
+ } else {
+ console.write("no payload");
+ }
+ console.write("\n");
if let Some(location) = info.location() {
console.write("at ");
print_dec(location.line());
console.write(":");
print_dec(location.column());
- console.write("\r\n");
+ console.write("\n");
} else {
- console.write("Unknown location\r\n");
+ console.write("Unknown location\n");
}
loop{}