3 个不稳定版本
0.3.0 | 2021年9月17日 |
---|---|
0.2.1 | 2019年11月28日 |
0.2.0 | 2019年11月25日 |
449 在 嵌入式开发 中
每月 1,267 次下载
在 booster 中使用
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);
}
// ...
}
功能
有几个可选功能,utf8
和 custom-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 License,版本2.0 (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
由您选择。
贡献
除非您明确声明,否则根据Apache-2.0许可证定义,您有意提交的任何贡献,都将按照上述方式双许可,不附加任何额外条款或条件。
依赖
~590KB