#panic-message #panic #panic-handler #persist #panic-impl

no-std panic-persist

在目标设备的 RAM 中持久化 panic 信息

3 个不稳定版本

0.3.0 2021年9月17日
0.2.1 2019年11月28日
0.2.0 2019年11月25日

449嵌入式开发

Download history 383/week @ 2024-03-24 354/week @ 2024-03-31 370/week @ 2024-04-07 459/week @ 2024-04-14 332/week @ 2024-04-21 166/week @ 2024-04-28 257/week @ 2024-05-05 256/week @ 2024-05-12 218/week @ 2024-05-19 247/week @ 2024-05-26 324/week @ 2024-06-02 216/week @ 2024-06-09 317/week @ 2024-06-16 240/week @ 2024-06-23 246/week @ 2024-06-30 448/week @ 2024-07-07

每月 1,267 次下载
booster 中使用

MIT/Apache

14KB
99

panic-persist

将 panic 信息写入 RAM 的一个区域

该 crate 包含一个 panic_fmt 实现,它将 panic 信息记录到用户定义的 RAM 区域,以便在下次启动时检索,并在 panic 上下文之外处理,例如发送到日志接口、写入闪存等。

将信息记录到 RAM 后,设备将自动软复位。

与其它方法不同,这允许在程序控制流中回溯 panic 的原因。

目前此 crate 仅在 ARM Cortex-M 架构上进行了测试,但应很容易地移植到其他平台。

文档

用法

向您的链接脚本添加一个部分

您需要预留一段 RAM 用于持久化消息。此部分必须足够大,可以容纳 8 字节的头信息,以及您希望持久化的任何 panic 信息。如果此部分中没有合适的空间,panic 信息将被截断。

此部分应位于任何其他部分之外,以防止程序初始化在启动时将这些部分清零或以其他方式修改这些部分。

修改前的 memory.x 文件

MEMORY
{
  /* NOTE K = KiBi = 1024 bytes */
  FLASH : ORIGIN  = 0x00000000, LENGTH = 512K
  RAM : ORIGIN    = 0x20000000, LENGTH = 64K
}

修改后的 memory.x 文件,用于保留 1K 区域

MEMORY
{
  /* NOTE K = KiBi = 1024 bytes */
  FLASH : ORIGIN  = 0x00000000, LENGTH = 512K
  RAM : ORIGIN    = 0x20000000, LENGTH = 63K
  PANDUMP: ORIGIN = 0x2000FC00, LENGTH = 1K
}

_panic_dump_start = ORIGIN(PANDUMP);
_panic_dump_end   = ORIGIN(PANDUMP) + LENGTH(PANDUMP);

程序用法示例

#![no_std]

use panic_persist as _;

#[entry]
fn main() -> ! {
    // Normal board setup...

    // Check if there was a panic message, if so, send to UART
    if let Some(msg) = get_panic_message_bytes() {
        board.uart.write(msg);
    }

    // ...
}

功能

有几个可选功能,utf8custom-panic-handler

utf8

这允许 panic 消息作为 &str 返回,而不是 &[u8],以便更容易打印。由于这需要验证 UTF-8 字符串(以确保字符串没有在字符中间被截断),它可能会增加代码大小的使用,并且默认是关闭的。

custom-panic-handler

这会禁用此库中的 panic 处理器,以便任何用户都可以实现自己的。为了持久化 panic 信息,提供了 report_panic_info 函数;

// My custom panic implementation
#[panic_handler]
fn panic(info: &PanicInfo) -> ! {
    // ...
    panic_persist::report_panic_info(info);
    // ...
}

min-panic

这会打印出一个更小的、只包含行号的消息,以减少持久化恐慌时所需的空间,但会丢失一些上下文。

来源

这个crate受到了panic-ramdump crate的启发(并由此分支而来)。

许可证

许可如下之一

由您选择。

贡献

除非您明确声明,否则根据Apache-2.0许可证定义,您有意提交的任何贡献,都将按照上述方式双许可,不附加任何额外条款或条件。

依赖

~590KB