#defmt #log-messages #fifo-queue #logging-framework #knurling #defmt-transport

无std defmt-bbq

基于bbqueue的通用defmt日志消息传输

3个不稳定版本

0.1.0 2021年12月17日
0.0.2 2021年12月14日
0.0.1 2021年12月14日

#915嵌入式开发

每月 33次下载
用于 teensy4-bsp

MIT/Apache

29KB
232

defmt-bbq

基于bbqueue的通用defmt日志消息传输

defmt(“de格式化”,缩写为“deferred formatting”)是一个针对资源受限设备(如微控制器)的高效日志框架。

该crate将日志消息存储到线程安全的FIFO队列中,然后可以通过任何媒介(如USB、RS-485或其他传输方式)进行传输。

尽管这个crate充当了defmtglobal_logger实现者,但它仍然需要你对消息进行操作。这旨在成为各种不同传输方法的可重用构建块。

使用方法

该crate要求用户执行以下操作

  1. (可选): 如果你想选择与默认的1024不同的队列大小,你需要在构建时设置DEFMT_BBQ_BUFFER_SIZE环境变量来配置大小。例如: DEFMT_BBQ_BUFFER_SIZE=4096 cargo build
  2. 在第一次defmt日志之前,用户必须调用defmt_bbq::init(),这将初始化日志缓冲区,并返回队列的Consumer部分,它提供了对传入日志消息的访问
  3. 用户必须定期清除日志消息。如果队列已满,任何额外的字节将被丢弃,可能会损坏(一些)日志消息

有关Consumer接口的更多信息,请参阅bbqueue crate文档中的Consumer文档

示例

#[entry]
fn main() {
    // MUST be called before the first `defmt::*` call!
    let mut consumer = defmt_bbq::init().unwrap();

    loop {
        defmt::println!("Hello, world!");

        if let Some(grant) = consumer.read() {
            // do something with `bytes`, like send
            // it over a serial port..

            // Then when done, make sure you release the grant
            // to free the space for future logging.
            let glen = grant.len();
            grant.release(glen);
        }
    }
}

有关通过USB串行更详细的端到端示例,请参阅项目的示例文件夹

默认功能(s)

该软件包具有一个默认功能,该功能启用 encoding-rzcobs 功能,这是 defmt 软件包的一部分。

强烈建议在使用此软件包时启用此功能(并使用 rzcobs 编码)。如果缓冲区被填满,则剩余的字节将被丢弃,这将暂时损坏消息流。

由于 rzcobs 以零字节为分隔符,因此可以从中恢复,但会丢失有限数量的消息。当使用“原始”编码时,您必须确保缓冲区 绝不能 被填满,因为无法从这种错误状态中恢复。

来源

此存储库是从 defmt 存储库中获取的 defmt-rtt 的分支。

此存储库是在上游提交 50e3db37d5429ed3344726f01e1bc4bf04902251 时分叉的。

许可

许可如下之一

由您选择。

贡献

除非您明确说明,否则任何您有意提交以包含在作品中的贡献,根据 Apache-2.0 许可证定义,应按上述方式许可,不附加任何其他条款或条件。

依赖项

~1.2–1.7MB
~30K SLoC