4个版本
0.1.3 | 2024年1月4日 |
---|---|
0.1.2 | 2021年4月27日 |
0.1.1 | 2020年8月21日 |
0.1.0 | 2020年4月19日 |
在#panic-message中排名第5
每月下载量7,847
在26 个crate中使用了它
45KB
623 行
panic-rtt-target
通过RTT记录panic消息。是rtt-target的配套crate。
文档
RTT必须通过使用rtt_init
宏之一进行初始化。否则,您将在编译时遇到链接器错误。
Panics始终在通道0上记录。在panic时,通道模式也会自动设置为BlockIfFull
,以确保始终记录完整消息。如果在RTT初始化之前(非常不可能)以某种方式在运行时panic,或者如果通道0不存在,则不会记录任何内容。
Panic处理程序在非返回的critical_section中运行,其实施应由用户提供。
用法
Cargo.toml
[dependencies]
cortex-m = { version = "0.7.6", features = ["critical-section-single-core"]}
panic-rtt-target = { version = "x.y.z" }
main.rs
#![no_std]
use panic_rtt_target as _;
use rtt_target::rtt_init_default;
fn main() -> ! {
// you can use any init macro as long as it creates channel 0
rtt_init_default!();
panic!("Something has gone terribly wrong");
}
实现细节
提供的中断处理程序检查RTT通道0是否已配置,写入info
并进入一个无限循环。如果RTT通道0未配置,panic处理程序将进入无法获取通道无限循环。可以通过中断/停止目标来观察最终状态。
fn panic(info: &PanicInfo) -> ! {
critical_section::with(|_| {
if let Some(mut channel) = unsafe { UpChannel::conjure(0) } {
channel.set_mode(ChannelMode::BlockIfFull);
writeln!(channel, "{}", info).ok();
} else {
// failed to get channel, but not much else we can do but spin
loop {
compiler_fence(SeqCst);
}
}
// we should never leave critical section
loop {
compiler_fence(SeqCst);
}
})
}
依赖项
~35KB