#rtt #panic-message #debugging #error-logging #no-std

no-std dev panic-rtt-target

使用rtt-target通过RTT记录panic消息

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

Download history 1905/week @ 2024-04-08 1269/week @ 2024-04-15 1153/week @ 2024-04-22 1553/week @ 2024-04-29 1256/week @ 2024-05-06 1147/week @ 2024-05-13 1262/week @ 2024-05-20 1413/week @ 2024-05-27 1356/week @ 2024-06-03 2146/week @ 2024-06-10 1603/week @ 2024-06-17 1315/week @ 2024-06-24 2981/week @ 2024-07-01 1975/week @ 2024-07-08 1747/week @ 2024-07-15 1084/week @ 2024-07-22

每月下载量7,847
26 个crate中使用了它

MIT许可证

45KB
623

panic-rtt-target

crates.io documentation

通过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