在zephyr上使用mipi-sys-t

Posted 17岁boy想当攻城狮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在zephyr上使用mipi-sys-t相关的知识,希望对你有一定的参考价值。

Mipi-Sys-T

简介

Mipi-Sys-T是低功耗数据传输协议,主要应用在底宽带、移动设备上用于打印LOG日志,它内部函数会将要打印的字符串经过算法进行转换并打印,它会将要打印的字符变的更短,在打印之后可以通过Mipi-Sys-T提供的printer工具进行解析

比如在Zephyr中开启了Mipi-Sys-T功能作为输出log的方式,那么Zephyr在你调用Printk或者LOG_DBG的时候都会在内部调用Mipi-Sys-T的API来对它进行编码后在打印

如当我们调用Printk或LOG_DBG打印一行日志:“Hello Word”,当开启Mipi-Sys-T之后打印时,它会经过Mipi-Sys-T进行重新编码,它会变成如下这串字符串:

OK,"Hello Word!",STRING:PRINTF32,MAX,,0,0x0000000000000001,0x0000000000000000,,26,,

上面这串字符串就是Mipi-Syst-T格式字符串,这组字符串里包含了:日期、时间、索引、字符串类型、长度、状态等一系列信息,它是以逗号作为分割,下面是它格式的语义:

Decode Status(解码状态),Payload(有效数据),Type(有效数据的类型),Severity(日志等级),Origin(来源),Unit(单元),Message TimeStamp(消息时间戳),Context TimeStamp(上下文时间戳),Location(位置),Raw Length(原始长度),Checksum(校验和),Collateral(附加信息)

这样编码目的是为了方便开发者们诊断,最后在经过Mipi-Sys-T算法进行编码后输出如下:

020A000B0C00010000000000000048656C6C6F20576F72642100

字符串明显变小了许多,这样的情况下就有效提升字符串传输能力,在低宽带的情况下这种效果是十分明显

在Zephry中使用它

配置

Mipi-Sys-T存在于Zephyr Work Dir/modules/debug/mipi-sys-t目录下,它以git子模块的形式存在于这个目录里,官方github项目地址:GitHub - zephyrproject-rtos/mipi-sys-t

首先你需要在你的prj.conf项目中开启它

CONFIG_LOG=y
CONFIG_LOG_PRINTK=y
CONFIG_LOG_MIPI_SYST_ENABLE=y
CONFIG_LOG_BACKEND_UART_SYST_ENABLE=y

这几个配置项介绍一下:

CONFIG_LOG:开启Logging模块

CONFIG_LOG_PRINTK:将printk的输出重定向到Logging

CONFIG_LOG_MIPI_SYST_ENABLE:使能Mipi-Sys-T

CONFIG_LOG_BACKEND_UART_SYST_ENABLE:开启使用uart输出时启用Mipi-Sys-T编码

这里解释一下为什么要开启LOG功能,,因为Mipi-Sys-T本身就是为输出Log日志而诞生的,所以当使用Mipi-Sys-T进行编码输出时Zephyr需要首先去调用Log功能对我们输出的日志进行封装,这些封装就包含增加字符串类型、长度、状态等信息,Zephyr将这部分功能划分到了LOG模块里去,所以如果要增加这些信息需要LOG模块的支持,如果没有开启LOG功能的情况下去使用Mipi-Sys-T进行编码输出是不会成功的

示例

下面是一个简单的示例代码:

#include <zephyr.h>
#include <sys/printk.h>
 
void main(void)

        printk("Hello Word!");

这里可以使用Qemu的方式进行编译与运行:

west build -b qemu_x86 mipi-sys-t-test
west build -t run

输出结果

SeaBios (version zephyr-v1.0.0-0-g31d4e0e-dirty-20200714_234759-fv-az50-zephyr)
Booting from ROM..SYS-T RAW DATA: 020A000B210001000000000000002A2A2A20426F6F74696E67205A6570687972204F53206275696C642076322E3700
SYS-T RAW DATA: 020A000B0C00010000000000000048656C6C6F20576F72642100

解码

当使用Mipi-Sys-T打印出来的字符串是被编码后的,如果想要转换回原始字符串需要使用Mipi-Sys-T提供的Printer工具进行解码,这个工具位于mipi-sys-t目录下的printer目录下,它是以源代码形式提供的,我们需要将它进行编译,首先我们进入到这个目录下,然后使用cmake的方式对它进行编译

mkdir build
cd build
cmake ..
make

编译完成之后你可以看到目录下有一个systprint的可执行文件,它的用法如下:

systprint mipi-sys-t-data

这里我们将qemu的输出重定向到一个文件里去:

west build -t run > /tmp/mipi-test

然后进行解码:

./systprint /tmp/mipi-test

输出:

Decode Status,Payload,Type,Severity,Origin,Unit,Message TimeStamp,Context TimeStamp,Location,Raw Length,Checksum,Collateral
OK,"Hello Word!",STRING:PRINTF32,MAX,,0,0x0000000000000001,0x0000000000000000,,26,,

以上是关于在zephyr上使用mipi-sys-t的主要内容,如果未能解决你的问题,请参考以下文章

在zephyr上使用mipi-sys-t

在Zephyr上使用malloc/new

Zephyr学习系统时钟

基于Zephyr在微型MCU上使用Tensor Flow Lite Micro做图像分类

Zephyr下使用TFLite进行语音识别

Zephyr的TimeTimersleep