#bare-metal #console #raspberry-pi #ruspiro

no-std ruspiro-console

适用于裸机实现的轻量级控制台抽象,将字符串打印到可轻松配置/连接的输出通道

15个不稳定版本 (5个重大更改)

0.5.3 2021年1月30日
0.4.1 2020年11月17日
0.3.1 2020年1月23日
0.3.0 2019年12月14日
0.0.2 2019年7月30日

#1819 in 嵌入式开发

Download history 36/week @ 2024-03-31

每月下载量 76次
ruspiro-sdk中使用

Apache-2.0

14KB
82

简单的控制台抽象RusPiRo crate

此crate提供控制台抽象,以实现字符串输出到可配置的输出通道。它还提供了方便的宏(print!println!),用于输出通常在 [no_std] 环境中不可用的文本。然而,此crate还提供了宏来指示要打印的消息的严重性。这些是 info!warn!error!

CI Latest Version Documentation License

依赖关系

此crate使用宏来提供格式化字符串。这种格式化需要一个内存分配器(作为 alloc crate 的一部分)。因此,当使用此crate时,提供如 ruspiro_allocator 的分配器。

使用方法

要使用此crate,只需将以下依赖项添加到您的 Cargo.toml 文件中

[dependencies]
ruspiro-console = "0.5.3"

一旦控制台crate可用,就可以使用常用的宏 print!println 输出字符串。然而,如果没有实际设置控制台输出,这些语句将不会在任何地方写入任何数据

use ruspiro_console::*;

fn demo() {
    let num: u32 = 10;
    println!("This is some text with a number: {}", num);
}

要实际设置活动输出通道,您需要提供一个实现 core::fmt::Write 特性的结构。例如,在Uart中可以这样完成

impl core::fmt::Write for Uart1 {
    fn write_str(&mut self, s: &str) -> core::fmt::Result {
        self.send_string(s);

        Ok(())
    }
}

如果实现了此特性,则可以使用该结构作为实际的控制台。要使用它,应在二进制的主crate的最早可能位置(例如内核)编写以下代码

use ruspiro_console::*;
use ruspiro_uart::*; // as we demonstrate the usage with the Uart.

fn demo() {
    let mut uart = Uart1::new(); // create a new uart struct
    if uart.initialize(250_000_000, 115_200).is_ok() { // initialize the Uart with fixed core rate and baud rate
        CONSOLE.with_mut(|cons| cons.replace(uart)); // from this point CONSOLE takes ownership of Uart
        // uncommenting the following line will give compiler error as uart is moved
        // uart.send_string("I'm assigned to a console");
    }

    // if everything went fine uart should be assigned to the console for generic output
    println!("Console is ready and display's through uart");
}

您还可以使用控制台crate初始化日志记录到Uart,当使用 loginfo!warn!error! 宏时。

use ruspiro_console::*;
use ruspiro_uart::*; // as we demonstrate the usage with the Uart.

fn demo() {
    let mut uart = Uart1::new(); // create a new uart struct
    if uart.initialize(250_000_000, 115_200).is_ok() { // initialize the Uart with fixed core rate and baud rate
        init_logger(LevelFilter::Error, uart); // from this point the logger takes ownership of uart
    }

    // if everything went fine uart should be assigned to the console for generic output
    println!("Console is ready and display's through uart");
}

!提示!由于 Write 特性要求在写入输出通道时结构是可变的,因此控制台操作是阻塞操作 -> 因此需要可能的原子操作 -> 因此需要在使用控制台抽象之前激活 MMU。否则,由于CPU无法处理原子操作,执行将 挂起

许可证

根据Apache许可证版本2.0许可,或MIT许可证选择使用(LICENSE-APACHEhttp://www.apache.org/licenses/LICENSE-2.0)或MIT(LICENSE-MIThttp://opensource.org/licenses/MIT)。

依赖关系

~160KB