在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的主要内容,如果未能解决你的问题,请参考以下文章