Rust嵌入式开发库panic-semihosting的使用,实现半主机模式下的panic处理和调试输出

panic-semihosting 的使用 - 实现半主机模式下的panic处理和调试输出

panic-semihosting 是一个用于嵌入式开发的Rust库,它通过半主机(semihosting)技术将panic信息报告到主机端的stderr。该库由Cortex-M团队开发和维护。

主要特性

  • 使用半主机技术将panic信息输出到主机端
  • 适用于嵌入式开发环境
  • 支持无标准库(no-std)环境

最低支持的Rust版本(MSRV)

该库保证在稳定版Rust 1.59.0及以上版本编译。可能在更旧版本也能编译,但任何新补丁版本都可能改变这一点。

许可证

采用以下任一许可证:

  • Apache License, Version 2.0
  • MIT license

示例代码

以下是使用panic-semihosting实现半主机模式下panic处理和调试输出的完整示例:

#![no_std]
#![no_main]

use cortex_m_rt::entry;
use panic_semihosting as _; // 使用半主机模式panic处理
use cortex_m_semihosting::hprintln; // 用于调试输出

#[entry]
fn main() -> ! {
    hprintln!("Hello, world!").unwrap(); // 半主机模式下的println
    
    // 触发一个panic
    panic!("This is a panic message that will be sent to the host via semihosting");
    
    // 注意:嵌入式程序通常不应该返回
    loop {}
}

配置说明

要在你的项目中使用panic-semihosting,需要添加以下依赖到Cargo.toml:

[dependencies]
panic-semihosting = "0.6.0"
cortex-m = "0.7.6"
cortex-m-rt = "0.7.0"
cortex-m-semihosting = "0.5.0"

工作原理

  1. 当panic发生时,panic-semihosting会通过半主机调用将错误信息发送到主机
  2. 主机端的调试器(如OpenOCD或JLinkGDBServer)会接收这些信息
  3. 调试器会将信息显示在控制台中

注意事项

  • 半主机模式需要调试器支持
  • 在某些目标平台上可能会影响性能
  • 生产环境中可能希望使用更轻量级的panic处理方式

这个库特别适合在开发阶段使用,因为它可以方便地将错误信息输出到主机端,便于调试。

完整示例代码

//! 半主机模式下的panic处理和调试输出示例

#![no_std]  // 不使用标准库
#![no_main] // 不使用标准main入口

use cortex_m_rt::entry;    // Cortex-M运行时入口
use panic_semihosting as _; // 导入panic处理程序
use cortex_m_semihosting::{hprintln, hprint}; // 半主机模式输出

#[entry]
fn main() -> ! {
    // 使用半主机模式打印简单消息
    hprintln!("系统启动...").unwrap();
    
    // 打印多个变量值
    let x = 42;
    let y = 3.14;
    hprintln!("调试值: x = {}, y = {:.2}", x, y).unwrap();
    
    // 使用hprint!实现不换行输出
    hprint!("准备触发panic... ").unwrap();
    hprintln!("操作已确认").unwrap();
    
    // 模拟文件读取错误
    let result: Result<(), &str> = Err("文件读取失败");
    if let Err(e) = result {
        // 触发带错误信息的panic
        panic!("发生严重错误: {}", e);
    }
    
    // 程序不应该到达这里
    loop {
        // 空闲循环
    }
}

Cargo.toml 完整配置示例

[package]
name = "semihosting-example"
version = "0.1.0"
edition = "2021"

[dependencies]
# 必要的依赖项
panic-semihosting = "0.6.0"    # panic处理
cortex-m = "0.7.6"            # Cortex-M支持
cortex-m-rt = "0.7.0"         # 运行时支持
cortex-m-semihosting = "0.5.0" # 半主机模式支持

[profile.release]
# 发布模式配置
opt-level = 3
debug = false
lto = true

构建和运行说明

  1. 确保已安装目标平台工具链,例如: rustup target add thumbv7m-none-eabi

  2. 使用cargo构建项目: cargo build --target thumbv7m-none-eabi

  3. 使用调试器(如OpenOCD)加载程序并运行

  4. 在调试器控制台将看到panic输出信息


1 回复

panic-semihosting:Rust嵌入式开发中的半主机模式panic处理和调试输出

介绍

panic-semihosting 是一个用于嵌入式开发的Rust库,它实现了通过半主机(semihosting)模式处理panic和输出调试信息的功能。这个库特别适合在ARM Cortex-M等嵌入式平台上使用,当目标设备通过调试器连接到主机时,可以将panic信息和调试输出显示在主机端的调试控制台中。

半主机模式是一种调试技术,允许目标设备通过调试接口使用主机(开发机)的I/O功能,如终端输出、文件操作等。

完整示例demo

以下是一个完整的嵌入式项目示例,展示如何使用panic-semihostingcortex-m-semihosting

  1. 项目结构:
.
├── Cargo.toml
├── .cargo
│   └── config.toml
└── src
    └── main.rs
  1. Cargo.toml内容:
[package]
name = "semihosting-demo"
version = "0.1.0"
edition = "2021"

[dependencies]
cortex-m = "0.7.6"
cortex-m-rt = "0.7.1"
panic-semihosting = "0.6"
cortex-m-semihosting = "0.3.5"
  1. .cargo/config.toml内容:
[target.'cfg(all(target_arch = "arm", target_os = "none"))']
runner = "arm-none-eabi-gdb"
rustflags = [
  "-C", "link-arg=-Tlink.x",
]
  1. src/main.rs完整代码:
#![no_std]
#![no_main]

use cortex_m::asm;
use cortex_m_semihosting::hprintln;
use panic_semihosting as _;

#[cortex_m_rt::entry]
fn main() -> ! {
    hprintln!("Starting semihosting demo").unwrap();

    // 演示变量输出
    let x = 42;
    hprintln!("The answer is {}", x).unwrap();

    // 模拟一个可能panic的情况
    let result = some_operation(10);
    hprintln!("Operation result: {}", result).unwrap();

    // 故意触发一个panic
    panic!("This is a simulated panic!");
}

fn some_operation(value: i32) -> i32 {
    if value > 100 {
        panic!("Value too large!");
    }
    value * 2
}

#[panic_handler]
fn panic(info: &core::panic::PanicInfo) -> ! {
    hprintln!("Custom panic handler: {}", info).unwrap();
    loop {
        asm::bkpt();  // 断点方便调试
    }
}

使用说明

  1. 这个示例展示了如何:

    • 配置半主机模式的panic处理
    • 使用半主机模式输出调试信息
    • 自定义panic处理函数
    • 在嵌入式环境中处理错误
  2. 当运行这个程序时:

    • 将通过调试器连接的主机控制台输出所有调试信息
    • 当panic发生时,会显示自定义的panic信息
    • 程序会在panic后进入无限循环并触发断点
  3. 生产环境注意事项:

    • 记得在生产版本中禁用半主机模式
    • 可以使用条件编译来区分开发和生产环境
    • 考虑实现一个不会阻塞的panic处理程序

这个完整示例涵盖了panic-semihosting的主要用法,可以作为嵌入式开发的起点。

回到顶部