diff --git a/Cargo.toml b/Cargo.toml index aae53d0..0136b8e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -90,7 +90,6 @@ embedded-io-async = { version = "0.7.0", optional = true } esp-alloc = { version = "0.10.0", optional = true } esp-backtrace = { version = "0.19.0", optional = true, features = [ "esp32c5", - "panic-handler", "println", ] } esp-println = { version = "0.17.0", optional = true, default-features = false, features = ["colors", "critical-section", "jtag-serial", "esp32c5", "log-04"] } diff --git a/src/main.rs b/src/main.rs index e37ba83..28c823e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -39,7 +39,7 @@ use embassy_gps::gps::l76k; use esp_backtrace as _; use esp_hal::clock::CpuClock; use esp_hal::timer::timg::TimerGroup; -#[cfg(all(target_arch = "riscv32", feature = "spat"))] +#[cfg(target_arch = "riscv32")] use esp_println::println; use esp32_cits_core::radio; use geonetworking::Decode as _; @@ -78,6 +78,26 @@ const SERIAL_FIFO_SIZE_THLD: u8 = 100; // hardware has max. 128 byte // For more information see: esp_bootloader_esp_idf::esp_app_desc!(); +// Print a backtrace and reset (instead of halting) +#[panic_handler] +fn panic_handler(info: &core::panic::PanicInfo) -> ! { + println!(""); + println!("====================== PANIC ======================"); + println!("{}", info); + + println!("\nBacktrace:"); + let backtrace = esp_backtrace::Backtrace::capture(); + for frame in backtrace.frames() { + println!("- 0x{:x}", frame.program_counter()); + } + + println!("================== BACKTRACE END =================="); + + // reboot + println!("-> Doing a SW reset after panic...\n"); + esp_hal::system::software_reset(); +} + #[cfg(feature = "_gnss")] static GNSS_UPDATE: Mutex>> = Mutex::new(RefCell::new(None)); static WIFI_RX_QUEUE: Mutex>>>> = Mutex::new(RefCell::new(None));