P.EMB.01 no-std 下必须定义一个Panic行为以确保安全

【描述】

鉴于#![no_std]应用程序没有标准输出,并且某些#![no_std]应用程序(例如嵌入式应用程序)需要不同的 Panic 行为来进行开发和发布。

因此,可以通过属性宏#[panic_handler]来定义 Panic 行为。

【正例】

定义 panic-semihosting Crate,将 Panic 消息记录到 Host 的 stderr :

#![allow(unused)] #![no_std] fn main() { use core::fmt::{Write, self}; use core::panic::PanicInfo; struct HStderr { // .. } #[panic_handler] fn panic(info: &PanicInfo) -> ! { let mut host_stderr = HStderr::new(); // logs "panicked at '$reason', src/main.rs:27:4" to the host stderr writeln!(host_stderr, "{}", info).ok(); loop {} } }

定义 panic-halt Crate,将 Panic 消息丢弃。

#![allow(unused)] #![no_std] fn main() { use core::panic::PanicInfo; #[panic_handler] fn panic(_info: &PanicInfo) -> ! { loop {} } }

app Crate 中, Debug 和 Release 编译模式调用不同的 Panic 行为。

#![no_std] // dev profile #[cfg(debug_assertions)] extern crate panic_semihosting; // release profile #[cfg(not(debug_assertions))] extern crate panic_halt; fn main() { // .. }