久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
[開源]輕量級環形緩沖區Ring Buffer,非常適合用于MCU嵌入式平臺的串口收發
[打印本頁]
作者:
netube
時間:
2021-1-30 11:53
標題:
[開源]輕量級環形緩沖區Ring Buffer,非常適合用于MCU嵌入式平臺的串口收發
Ring Buffer
是一個基于C語言開發的輕量級環形緩沖區,適用于各嵌入式平臺的串口收發等應用場景;
相較于普通的收發緩沖數組,環形緩沖區的操作更加簡單,性能更加強大;
使用Ring Buffer提供的函數,可以輕松實現數據的讀寫、查詢、刪除等操作,不需要編寫復雜的地址記錄、讀寫計數等代碼,減少了數據指針溢出、數據被覆蓋的風險;
同時Ring Buffer還提供了可自定義分隔關鍵字的插入、查找等功能,運用在嵌入式的串口收發中可以實現多段數據的儲存,段落之間分隔獨立,讀寫緩沖區不再受到硬件時序的阻塞,降低串口對芯片實時響應的要求并提升了數據傳輸的可靠性;
代碼已在GD32F130C8T6 MCU平臺上通過編譯,已進行過大量數據的串口收發壓力測試,暫未發現顯性BUG;
項目開源地址:
Github
XCOM_V2.2_VokMjsmVNN.png
(35.31 KB, 下載次數: 110)
下載附件
2021-1-30 11:51 上傳
2021.01.19 v1.0.0 發布第一版本
2021.01.24 v1.1.0 增加匹配字符查找函數
2021.01.27 v1.2.0 重制匹配字符查找函數,現已支持8位到32位關鍵詞查詢
2021.01.28 v1.3.0 復位函數修改為刪除函數、增加關鍵詞插入函數(自適應大小端)
2021.01.30 v1.3.1 修復String讀寫函數的小概率指針溢出錯誤
持續更新中,歡迎大家使用,如果有BUG請到Github上及時向我反饋,謝謝
同時我在GD32F130平臺上基于Ring Buffer庫開發了一款單片機串口收發框架UIO,開發UIO的目的也是為了更好的利用Ring Buffer的特點,在實際使用環形緩沖的過程中不斷的優化與改進;
使用UIO后,你可以在單片機中同時緩存好幾條串口指令卻不需要實時處理,等到單片機忙完其他阻塞任務后再將接收緩存的串口數據逐條讀出并逐條處理,從容不迫;
UIO的大部分代碼與平臺分離,移植簡單,同時對硬件串口外設進行封裝,在應用層開發的時候非常方便,UIO仍在加緊時間開發并測試,屆時將會第一時間開源分享給大家吐槽,敬請期待吧!
歡迎關注我的b站視頻賬號:
bilibili
作者:
netube
時間:
2021-1-30 12:12
復制庫文件至工程中,在源代碼中引用 Ring Buffer 頭文件;
新建一個 uint8_t 數組,數組的大小即是環形緩沖區的大小;
新建 Ring Buffer 操作句柄;
初始化 Ring Buffer 操作句柄,將其與剛才新建的數組綁定,轉換成環形緩沖區;
這時候我們就可以使用庫提供的各種函數對新建的緩沖區進行讀寫等操作;
函數詳細內容請在編程的過程中參考ring_buffer.c內的注釋;
作者:
netube
時間:
2021-1-30 12:13
在這里我展示了如何新建并初始化Ring Buffer、讀寫環形緩沖、查詢數據長度等基礎操作
您可以了解到Ring Buffer的函數命名與參數的風格和基本的使用方法
#include <stdio.h>
#include <ring_buffer.h>
#define Read_BUFFER_SIZE 256
int main()
{
//新建緩沖區數組與Ring Buff操作句柄
uint8_t buffer[Read_BUFFER_SIZE] ;
ring_buffer RB ;
//初始化Ring Buff操作句柄,綁定緩沖區數組;
Ring_Buffer_Init(&RB, buffer, Read_BUFFER_SIZE);
//向環形緩沖區寫入一段字節和一個字節
Ring_Buffer_Write_String(&RB, "hello world", 11);
Ring_Buffer_Write_Byte(&RB, '!');
//獲取已儲存的數據長度,讀出環形緩沖區中的數據并打印
uint32_t num = Ring_Buffer_Get_Lenght(&RB);
uint8_t get[16] ;
Ring_Buffer_Read_String(&RB, get, num);
printf("%s", get);
return 0 ;
}
復制代碼
作者:
netube
時間:
2021-1-30 12:13
除了基本的讀寫操作之外,為了更好的利用環形這一特點,我加入了分隔關鍵詞、查詢關鍵詞、刪除數據等功能
基于這些功能您可以在串口收發中實現多段數據的緩存與準確讀取;降低了實時性響應的要求、提升了串口收發的性能
#include <stdio.h>
#include <ring_buffer.h>
#define Read_BUFFER_SIZE 256
//設定一個分隔關鍵詞和關鍵詞的長度(字節)
#define SEPARATE_SIGN 0xCCFB22AA
#define SEPARATE_SIGN_SIZE 4
int main()
{
//新建緩沖區數組與Ring Buff操作句柄
uint8_t buffer[Read_BUFFER_SIZE] ;
ring_buffer RB ;
//初始化Ring Buff操作句柄,綁定緩沖區數組;
Ring_Buffer_Init(&RB, buffer, Read_BUFFER_SIZE);
//記錄段落數量
uint8_t String_Count = 0 ;
//向環形緩沖區寫入三段數據,每段之間插入一個分隔關鍵詞
Ring_Buffer_Write_String(&RB, "ABCDEFGHIJK\r\n", 13);//寫入一段數據
Ring_Buffer_Insert_Keyword(&RB, SEPARATE_SIGN, SEPARATE_SIGN_SIZE);//插入一個分隔關鍵詞
String_Count ++ ;//記錄段落數量 +1
Ring_Buffer_Write_String(&RB, "abcdefg\r\n", 9);
Ring_Buffer_Insert_Keyword(&RB, SEPARATE_SIGN, SEPARATE_SIGN_SIZE);
String_Count ++ ;
Ring_Buffer_Write_String(&RB, "1234\r\n", 6);
Ring_Buffer_Insert_Keyword(&RB, SEPARATE_SIGN, SEPARATE_SIGN_SIZE);
String_Count ++ ;
while(String_Count != 0)
{
uint8_t get[16] ;
//獲得頭指針到關鍵詞高位的距離,距離-1得到第一段數據的長度
uint8_t lenght = Ring_Buffer_Find_Keyword(&RB, SEPARATE_SIGN, SEPARATE_SIGN_SIZE) - 1 ;
Ring_Buffer_Read_String(&RB, get, lenght);//讀取一段數據,保存到get數組
printf("%s", get);//打印數據
Ring_Buffer_Delete(&RB, SEPARATE_SIGN_SIZE);//刪除分隔關鍵詞的長度的數據,即刪除關鍵詞
String_Count -- ;//記錄段落數量 -1
}
return 0 ;
}
復制代碼
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
国产成人91视频
|
午夜小视频在线观看
|
日韩视频一区二区三区
|
毛片入口
|
羞羞视频在线观看
|
99综合在线
|
精品日韩
|
久久一二
|
91精品久久久久久久久中文字幕
|
阿v视频在线观看
|
免费黄色日本
|
99久久婷婷国产综合精品
|
午夜在线精品偷拍
|
国产精品欧美一区二区三区
|
久久久久久av
|
免费中文字幕
|
免费性视频
|
9久9久9久女女女九九九一九
|
中文字幕一区二区在线观看
|
www.亚洲精品
|
一级毛片大全免费播放
|
精品综合网
|
国产欧美精品一区二区色综合
|
人人看人人干
|
成人在线一区二区三区
|
久久国产精品99久久久大便
|
精品国产乱码久久久久久1区2区
|
午夜电影福利
|
91久久
|
www.四虎.com
|
国产在线精品区
|
久久精品一区二区三区四区
|
一区二区三区免费
|
欧美一级片在线播放
|
日韩免费在线
|
91精品国产乱码久久久久久久
|
成人影院在线
|
中文字幕在线免费观看
|
亚洲高清在线观看
|
亚洲永久免费
|
黄色免费在线观看网站
|