摘要: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个功能:

  1. 不带侦听器和结构的发送TF_SendSimple();
  2. 发送时侦听器正在等待答复,但不使用结构TF_QuerySimple();
  3. 不带侦听器发送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

操作步骤如下:

  1. 参照上述使能TinyFrame demo。
  2. 在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/。
  3. 执行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
--------------------
...
...
...

点击关注,第一时间了解华为云新鲜技术~

一起玩转玩转LiteOS组件:TinyFrame的更多相关文章

  1. 玩转LiteOS组件:玩转Librws

    摘要:Librws是一个跨平台的websocket客户端,使用C语言编写. 本文分享自华为云社区<LiteOS组件尝鲜-玩转Librws>,作者: W922 . 本期小编为大家带来Lite ...

  2. 带你尝鲜LiteOS 组件EasyFlash

    摘要:EasyFlash是一个开源的轻量级嵌入式闪存库. 本文分享自华为云社区<LiteOS组件尝鲜-玩转EasyFlash>,作者:Lionlace . 基本介绍 EasyFlash是一 ...

  3. 为什么说程序员都应该玩一玩GitHub

    既熟悉又陌生的GitHub 关于GitHub,相信每一个程序员都再熟悉不过了.它为开发者提供Git仓库的托管服务,是全世界最大的代码集中地,被戏称为“全球最大同性交友网站”. 但是对于很大一部分程序员 ...

  4. 玩一玩nodejs--一个简单的在线实时填表应用

    学习nodejs三天,入了个门,感觉他和jsp.php还是存在较大的差别.本文首先复习这些天学的一些知识点,然后谈一下如何一步一步到做一个在线实时填表的小应用,进一步巩固一下这些个知识点.这里先简单介 ...

  5. 无语啊,sublime给我弄乱玩,玩坏了,而且安装插件也安装不了

    国内的什么插件地址都TMMD失效了,没办法,只能翻"强"到外面找了,而且找了很多也用不了,所以收藏一个为了预防以后不行有补救的方法: 百度的99%都不行,不是报这个错就是那个错,可 ...

  6. 想挑战AlphaGO吗?先和PostgreSQL玩一玩?? PostgreSQL与人工智能(AI)

    1月4日晚,随着古力认输,Master对人类顶尖高手的战绩停留在60胜0负1和,而令人尴尬的是这唯一一场和棋还是因为棋手掉线系统自动判和,并不是棋盘上的局势真的势均力敌了.包括聂卫平.柯洁.朴廷桓.井 ...

  7. js 玩一玩

    闲着没事学了学js,做了一个下页面玩玩. 下面是html代码: <!DOCTYPE html><html> <head> <meta charset=&quo ...

  8. 玩一玩基于Token的 自定义身份认证+权限管理

    使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录.大概的流程是这样的: 客户端使用用户名跟密码请求登录 服务端收到请求,去验证用户名与密码 验证成功后,服务端会签发一个 Toke ...

  9. .NET Core 玩一玩 Ocelot API网关

    .net 这几年国内确实不好过. 很多都选择转行.不过.net Core跨平台 开源之后 .社区的生态在慢慢建立.往好的趋势发展. 对于坚守在.NET战线的开发者来说 是个挺不错的消息.  特别是微软 ...

随机推荐

  1. 【LeetCode】125. Valid Palindrome 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 解题方法 列表生成式 正则表达式 双指针 日期 题目地址:https:/ ...

  2. Java代码性能优化

    (1)在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面: 控制资源的使用,通过线程同步来控制资源的并 ...

  3. RabbitMQ 七种队列模式

    (1)简单模式(Hello World) 做最简单的事情,一个生产者对应一个消费者,RabbitMQ相当于一个消息代理,负责将A的消息转发给B 应用场景: 将发送的电子邮件放到消息队列,然后邮件服务在 ...

  4. [Xavier] Understanding the difficulty of training deep feedforward neural networks

    目录 概 主要内容 Glorot X, Bengio Y. Understanding the difficulty of training deep feedforward neural netwo ...

  5. vue使用v-chart图表出现的问题

    npm i v-charts echarts -S 引入 import VCharts from 'v-charts' Vue.use(VCharts) 后发现报错,后来发现安装echarts版本太高 ...

  6. 编写Java程序,演练匿名内部类应用

    返回本章节 返回作业目录 需求说明: 定义一个抽象类 Bird,创建使用匿名内部类的操作类Action. 实现思路: 定义抽象类Bird.在其中定义一个String类型的name属性,一个返回类型是i ...

  7. mysql总结笔记 -- 索引篇

    索引的作用 索引是用来高效的获取数据的 排好序 的 数据结构,如果没有索引,可能会导致查询某一条记录的时候遍历整张表:所以适当的索引可以大大的提升检索速度: 索引的数据结构 二叉树 假如说我们有一列数 ...

  8. 关于C#的decimal浮点类型转化成字符串时末尾存在多个0

    首先,对于浮点类型,double和float存在精度丢失问题,这一点在之前的一篇博文中有提到(C# double类型精度丢失问题),于是,一般时候推荐大家使用decmal,特别是涉及到一些金融计算时, ...

  9. C# double类型精度丢失问题

    我们先看一段代码,可以在控制台程序中执行看看结果 { double d = 500; double d1 = 233.84; double d2 = d - d1; //d2=266.15999999 ...

  10. 【Warrior刷题笔记】力扣169. 多数元素 【排序 || 哈希 || 随机算法 || 摩尔投票法】详细注释 不断优化 极致压榨

    题目 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/majority-element/ 注意,该题在LC中被标注为easy,所以我们更多应该关 ...