一起玩轉玩轉LiteOS元件:TinyFrame

華為雲開發者社群發表於2022-01-28
摘要: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
--------------------
...
...
...

 

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

相關文章