< 返回版块

2019-05-13 06:50    责任编辑:Flymachine

标签:嵌入式Rust之书,The Embedded Rust Book,STM32

Semihosting 半主机

原版Github: https://github.com/rust-embedded/book/

本翻译依照版本:9858872bd1b7dbba5ec27dc30d34eba00acd7ef9

翻译人员:Flymachine

翻译版错误与建议反馈:[email protected]

原版及翻译版均遵循以下协议:

半主机(Semihosting)是一种允许嵌入式设备在主机上执行I/O的机制,主要用于将消息记录到主机控制台。半主机(Semihosting)只需要一个调试会话,几乎不需要其他任何东西(不需要额外的导线!)所以它使用起来非常方便。缺点是它非常慢:每次写操作可能需要几毫秒,具体取决于你使用的硬件调试器(例如ST-Link)。

cortex-m-semihosting crate(译注:同lib,库)提供了一个API来对Cortex-M设备进行半主机(semihosting)操作。下面的程序是“Hello, world!”的半主机(semihosting)版本:

#![no_main]
#![no_std]

extern crate panic_halt;

use cortex_m_rt::entry;
use cortex_m_semihosting::hprintln;

#[entry]
fn main() -> ! {
    hprintln!("Hello, world!").unwrap();

    loop {}
}

如果你在硬件上运行这个程序,你会看到在OpenOCD日志中看到“Hello, world!” 信息。

$ openocd
(..)
Hello, world!
(..)

你需要首先从GDB那启用OpenOCD的半主机(semihosting):

(gdb) monitor arm semihosting enable
semihosting is enabled

QEMU了解半主机(semihosting)操作,因此上述程序也可以与qemu-system-arm一起使用,而无需启动调试会话。请注意,你需要将-semihosting-config标志传递给QEMU以启用半主机(semihosting)支持;这些标志已经包含在模板的.cargo / config文件中。

$ # 该程序将阻塞终端
$ cargo run
     Running `qemu-system-arm (..)
Hello, world!

还有一个exit半主机(semihosting)操作,可以用来终止QEMU进程。重要的是:不要在硬件上使用debug::exit函数;此函数可能会破坏你的OpenOCD会话,并且在重新启动它之前你将无法调试更多程序。

#![no_main]
#![no_std]

extern crate panic_halt;

use cortex_m_rt::entry;
use cortex_m_semihosting::debug;

#[entry]
fn main() -> ! {
    let roses = "blue";

    if roses == "red" {
        debug::exit(debug::EXIT_SUCCESS);
    } else {
        debug::exit(debug::EXIT_FAILURE);
    }

    loop {}
}
$ cargo run
     Running `qemu-system-arm (..)

$ echo $?
1

最后一个提示:你可以将恐慌(panicking,译注:指一种严重错误)行为设置为exit(EXIT_FAILURE)。这将允许你编写可以在QEMU上运行的no_std的运行(run-pass)测试。

为方便起见,panic-semihosting crate(译注:同lib,库)有一个“exit”(退出)功能,启用后当恐慌(panicking,译注:指一种严重错误)信息传到主机stderr后,就会去调用exit(EXIT_FAILURE)

#![no_main]
#![no_std]

extern crate panic_semihosting; // features(特征) = ["exit"]

use cortex_m_rt::entry;
use cortex_m_semihosting::debug;

#[entry]
fn main() -> ! {
    let roses = "blue";

    assert_eq!(roses, "red");

    loop {}
}
$ cargo run
     Running `qemu-system-arm (..)
panicked at 'assertion failed: `(left == right)`
  left: `"blue"`,
 right: `"red"`', examples/hello.rs:15:5

$ echo $?
1

上一节 2.3. Memory-mapped Registers 内存映射寄存器

目录 Index 目录

下一节 2.5. Panicking 恐慌(译者注:正在翻译中)