一起玩轉玩轉LiteOS組件:TinyFrame

摘要: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
--------------------
...
...
...

 

點擊關注,第一時間了解華為雲新鮮技術~