摘要:TinyFrame是一个简单的用于解析串口(如 UART、telnet、套接字等)通信数据帧的库。
本文分享自华为云社区《LiteOS组件尝鲜—玩转TinyFrame》,作者:Lionlace。
基本介绍
TinyFrame是一个简单的用于解析串口(如 UART、telnet、套接字等)通信数据帧的库。它可以灵活处理通信双方之间的消息会话、响应侦听者、校验及超时问题。该库允许注册侦听器(以回调函数形式)用于等待:任何帧、特定帧类型以及特定消息ID,这种高通用性的API可以满足绝大部分通信场景。
功能概览
帧结构
每个帧由帧头和payload组成。这两个部分都可以通过校验和来保护,以排除格式错误的报头(例如,错误的字段长度)或payload损坏的帧。帧中的所有字段大小都是可配置的。例如,用户可以更改配置文件中的某个字段TF_LEN_BYTES为不同值(1、2 或 4)。
,-----+-----+-----+------+------------+- - - -+-------------,
| SOF | ID | LEN | TYPE | HEAD_CKSUM | DATA | DATA_CKSUM |
| 0-1 | 1-4 | 1-4 | 1-4 | 0-4 | ... | 0-4 | <- size (bytes)
'-----+-----+-----+------+------------+- - - -+-------------'
SOF ......... start of frame, usually 0x01 (optional, configurable)
ID ......... the frame ID (MSb is the peer bit)
LEN ......... number of data bytes in the frame
TYPE ........ message type (used to run Type Listeners, pick any values you like)
HEAD_CKSUM .. header checksum
DATA ........ LEN bytes of data
DATA_CKSUM .. data checksum (left out if LEN is 0)
消息监听
TinyFrame有 3 种侦听器类型,按优先顺序排列:
- ID侦听器—等待响应
- 类型侦听器—等待给定类型字段的消息
- 通用侦听器—回退
数据缓冲
TinyFrame使用两个数据缓冲区:一个小的发送缓冲区和一个较大的接收缓冲区。发送缓冲区用于准备要发送的字节,可以一次全部发送;如果缓冲区不够大,则以循环方式发送。缓冲区必须只包含整个帧头,例如对于短消息,32字节即可。
使用说明
LiteOS中提供了TinyFrameDemoTask来演示如何使用TinyFrame组件。目前支持在以下开发板上运行TinyFrameDemoTask。
- STM32F769
- STM32F429
- realview-pbx-a9
- qemu-virt-a53
接下来以TinyFrameDemo为例介绍TinyFrame的使用。
解析TinyFrame Demo
在TinyFrame_demo.c中主要实现3个功能:
- 不带侦听器和结构的发送TF_SendSimple();
- 发送时侦听器正在等待答复,但不使用结构TF_QuerySimple();
- 不带侦听器发送TF_Send()。
使能TinyFrame Demo
在LiteOS源码根目录下执行make menuconfig命令,按如下菜单路径使能
TinyFrame Demo。
Demos --->
Utility Demo --->
[*] Enable TinyFrame Demo (NEW)
使能TinyFrame Demo后会自动使能TinyFrame组件。
保存退出后,会从github上自动下载TinyFrame源代码,并从gitee上下载适配LiteOS系统的patch包,并打入patch。
编译运行TinyFrame Demo
操作步骤如下:
- 参照上述使能TinyFrame demo。
- 在Linux主机的LiteOS源码根目录下执行make clean ; make -j命令编译LiteOS工程,编译成功后将在~/Huawei_LiteOS/out/${platform}/lib目录下生成TinyFrame的库文件libTinyFrame.a和此Demo库文件libTinyFrame_demo.a,系统镜像文件为Huawei_LiteOS.bin。以realview-pbx-a9/开发板为例,其目录就是out/realview-pbx-a9/。
- 执行qemu-system-arm -machine realview-pbx-a9 -smp 4 -m 512M -kernel out/realview-pbx-a9/Huawei_LiteOS.bin -nographic命令后,可以看到串口输出Demo部分运行结果,如下所示。
********Hello Huawei LiteOS********
LiteOS Kernel Version : 5.1.0
Processor : Cortex-A9 * 4
Run Mode : SMP
GIC Rev : GICv1
build time : Dec 20 2021 11:30:07
**********************************
main core booting up...
OsAppInit
releasing 3 secondary cores
cpu 0 entering scheduler
cpu 3 entering scheduler
cpu 2 entering scheduler
cpu 1 entering scheduler
app init!
TinyFrame demo task start to run.
--------------------
TF_WriteImpl - sending frame:
1 01 .
128 80 .
0 00 .
7 07 .
1 01 .
240 F0 .
215 D7 .
108 6C l
105 69 i
116 74 t
101 65 e
111 6F o
115 73 s
0 00 .
213 D5 .
30 1E .
--- end of frame ---
GenericListener demo
Frame info
type: 01h
data: "liteos"
len: 7
id: 80h
--------------------
...
...
...