日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

好项目,不私藏!适用于单片机开发的开源轮子

發(fā)布時間:2023/11/30 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 好项目,不私藏!适用于单片机开发的开源轮子 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

點擊上方“小麥大叔”,選擇“置頂/星標公眾號”

福利干貨,第一時間送達

大家好,我是小麥。今天推薦一個適用于單片機裸機開發(fā)的開源輪子。

QueueForMcu

基于單片機實現(xiàn)的隊列功能模塊,主要用于8位、16位、32位非運行RTOS的單片機應用,兼容大多數(shù)單片機平臺。

開源代碼:https://github.com/xiaoxinpro/QueueForMcu

一、特性

  • 動態(tài)創(chuàng)建隊列對象

  • 動態(tài)設置隊列數(shù)據(jù)緩沖區(qū)

  • 靜態(tài)指定隊列元素數(shù)據(jù)長度

  • 采用值傳遞的方式保存隊列數(shù)據(jù)

二、快速使用

#include?"queue.h"#define?Q_UART_BUFFER_SIZE??1024QUEUE_HandleTypeDef?qUartTx; QUEUE_DATA_T?BufferUartTx[Q_UART_BUFFER_SIZE];int?main(void) {QUEUE_DATA_T?temp;//初始化隊列Queue_Init(&qUartTx,?BufferUartTx,?Q_UART_BUFFER_SIZE);while(1){//入隊Queue_Push(&qUartTx,?'Q');Queue_Push(&qUartTx,?'u');Queue_Push(&qUartTx,?'e');Queue_Push(&qUartTx,?'u');Queue_Push(&qUartTx,?'e');//出隊Queue_Pop(&qUartTx,?&temp);Queue_Pop(&qUartTx,?&temp);Queue_Pop(&qUartTx,?&temp);Queue_Pop(&qUartTx,?&temp);Queue_Pop(&qUartTx,?&temp);} }

三、配置說明

目前QueueForMcu只有一個靜態(tài)配置項,具體如下:

在文件 queue.h 中有一個宏定義 QUEUE_DATA_T 用于指定隊列元素的數(shù)據(jù)長度,默認是 unsigned char ,可以根據(jù)需要更改為其他數(shù)據(jù)類型。

四、數(shù)據(jù)結構

隊列的數(shù)據(jù)結構為 QUEUE_HandleTypeDef 用于保存隊列的狀態(tài),源碼如下:

typedef?struct?QUEUE_HandleTypeDef{unsigned?int?head;??????????????????????//隊列頭指針unsigned?int?tail;??????????????????????//隊列尾指針unsigned?int?buffer_length;?????????????//隊列緩存長度(初始化時賦值)QUEUE_DATA_T?*?buffer;??????????????????//隊列緩存數(shù)組(初始化時賦值) }QUEUE_HandleTypeDef;

其中 QUEUE_DATA_T 為配置項中自定義的數(shù)據(jù)類型。

五、創(chuàng)建隊列

1、創(chuàng)建隊列緩存

由于我們采用值傳遞的方式保存隊列數(shù)據(jù),因此我們在創(chuàng)建隊列前要手動創(chuàng)建一個隊列緩存區(qū),用于存放隊列數(shù)據(jù)。

QUEUE_DATA_T?BufferUartTx[1024];

以上代碼即創(chuàng)建一個大小為 1024 的隊列緩存區(qū)。

2、創(chuàng)建隊列結構

接下來使用 QUEUE_HandleTypeDef 創(chuàng)建隊列結構,用于保存隊列的狀態(tài):

QUEUE_HandleTypeDef?qUartTx;

3、初始化隊列

準備好隊列緩存和隊列結構后調用 Queue_Init 函數(shù)來創(chuàng)建隊列,該函數(shù)原型如下:

void?Queue_Init(QUEUE_HandleTypeDef?*?hqueue,?QUEUE_DATA_T?*?buffer,?unsigned?int?len)

參數(shù)說明:

參數(shù)名描述
hqueue需要初始化的隊列結構,如果二次初始化將清空原隊列的內(nèi)容。
buffer隊列緩存的首地址指針
len隊列長度,不能比隊列緩存長度還要大。

參考代碼:

Queue_Init(&qUartTx,?BufferUartTx,?Q_UART_BUFFER_SIZE);

六、壓入隊列

1、單數(shù)據(jù)壓入

將數(shù)據(jù)壓入隊列尾部使用 Queue_Push 函數(shù),該函數(shù)原型如下:

QUEUE_StatusTypeDef?Queue_Push(QUEUE_HandleTypeDef?*?hqueue,?QUEUE_DATA_T?data)

參數(shù)說明:

參數(shù)名描述
hqueue需要壓入數(shù)據(jù)的隊列結構。
data待壓入隊列的數(shù)據(jù)。

返回值說明:

該函數(shù)會返回一個 QUEUE_StatusTypeDef 枚舉數(shù)據(jù)類型,返回值會根據(jù)隊列狀態(tài)返回以下幾個值:

返回值描述
QUEUE_OK數(shù)據(jù)壓入隊列成功。
QUEUE_OVERLOAD未壓入數(shù)據(jù)到隊列中,原因隊列已滿。

參考代碼:

Queue_Push(&qUartTx,?'Q'); Queue_Push(&qUartTx,?0x51); Queue_Push(&qUartTx,?81);

2、多數(shù)據(jù)壓入

若需要將多個數(shù)據(jù)(數(shù)組)壓入隊列可以使用 Queue_Push_Array 函數(shù),原理上循環(huán)調用 Queue_Push 函數(shù)來實現(xiàn)的,函數(shù)原型如下:

unsigned?int?Queue_Push_Array(QUEUE_HandleTypeDef?*?hqueue,?QUEUE_DATA_T?*?pdatas,?unsigned?int?len)

參數(shù)說明:

參數(shù)名描述
hqueue需要壓入數(shù)據(jù)的隊列結構。
pdatas待壓入隊列的數(shù)組首地址。
len待壓入隊列的數(shù)組長度。

當數(shù)組長度大于隊列剩余長度時,數(shù)組多余的數(shù)據(jù)將被忽略。

返回值說明:

  • 該函數(shù)將返回實際被壓入到隊列中的數(shù)據(jù)長度。

  • 當隊列中的剩余長度富余時,返回值將等于參數(shù) len 的值。

  • 當隊列中的剩余長度不足時,返回值為實際被壓入到隊列的數(shù)據(jù)長度。

七、彈出隊列

1、單數(shù)據(jù)彈出

將隊列頭部數(shù)據(jù)彈出隊列使用 Queue_Pop 函數(shù),需要注意的是,彈出的數(shù)據(jù)將從隊列中刪除,該函數(shù)原型如下:

QUEUE_StatusTypeDef?Queue_Pop(QUEUE_HandleTypeDef?*?hqueue,?QUEUE_DATA_T?*?pdata)

參數(shù)說明:

參數(shù)名描述
hqueue需要彈出數(shù)據(jù)的隊列結構。
pdata用于保存彈出數(shù)據(jù)變量的指針。

返回值說明:

該函數(shù)會返回一個 QUEUE_StatusTypeDef 枚舉數(shù)據(jù)類型,返回值會根據(jù)隊列狀態(tài)返回以下幾個值:

返回值描述
QUEUE_OK數(shù)據(jù)彈出隊列成功。
QUEUE_VOID未彈出數(shù)據(jù)到隊列中,原因隊列為空。

參考代碼:

QUEUE_DATA_T?temp; if(QUEUE_OK?=?Queue_Pop(&qUartTx,?&temp)) {//?temp?為隊列彈出的數(shù)據(jù) } else {//?彈出數(shù)據(jù)失敗 }

2、多數(shù)據(jù)彈出

若需要將多個數(shù)據(jù)彈出隊列可以使用 Queue_Pop_Array 函數(shù),原理上循環(huán)調用 Queue_Pop 函數(shù)來實現(xiàn)的,需要注意的是,成功彈出的數(shù)據(jù)將從隊列中刪除,函數(shù)原型如下:

unsigned?int?Queue_Pop_Array(QUEUE_HandleTypeDef?*?hqueue,?QUEUE_DATA_T?*?pdatas,?unsigned?int?len)

參數(shù)說明:

參數(shù)名描述
hqueue需要彈出數(shù)據(jù)的隊列結構。
pdatas用于保存彈出數(shù)據(jù)數(shù)組的首地址。
len需要彈出數(shù)據(jù)數(shù)組的長度。

當需要彈出數(shù)據(jù)的長度大于隊列中的數(shù)據(jù)長度時,彈出數(shù)組多余的空間將不會被賦值。

返回值說明:

  • 該函數(shù)將返回實際從隊列中彈出的數(shù)據(jù)長度。

  • 當隊列中的數(shù)據(jù)長度足夠時,返回值將等于參數(shù) len 的值。

  • 當隊列中的數(shù)據(jù)長度不足時,返回值為實際從隊列中彈出的數(shù)據(jù)長度。

3、單數(shù)據(jù)復制

當需要從隊列頭部獲取數(shù)據(jù),但又不希望數(shù)據(jù)從隊列中刪除時,可以使用 Queue_Peek 函數(shù)來實現(xiàn),該函數(shù)的參數(shù)與返回值與 Queue_Pop 完全相同。

使用 Queue_Peek 和 Queue_Pop 函數(shù)的區(qū)別在于:

  • Queue_Pop 得到隊列中的數(shù)據(jù)后會刪除隊列中的數(shù)據(jù)。

  • Queue_Peek 得到隊列中的數(shù)據(jù)后會保留隊列中的數(shù)據(jù)。

4、多數(shù)據(jù)復制

當需要從隊列頭部獲取多個數(shù)據(jù),但又不希望數(shù)據(jù)從隊列中刪除時,可以使用 Queue_Peek_Array 函數(shù)來實現(xiàn),該函數(shù)的參數(shù)與返回值與 Queue_Pop_Array 完全相同。

使用 Queue_Peek_Array 和 Queue_Pop_Array 函數(shù)的區(qū)別在于:

  • Queue_Pop_Array 得到隊列中的數(shù)據(jù)后會刪除隊列中的數(shù)據(jù)。

  • Queue_Peek_Array 得到隊列中的數(shù)據(jù)后會保留隊列中的數(shù)據(jù)。

八、其他功能

1、清空隊列

當需要清空隊列數(shù)據(jù)時,無需彈出所有數(shù)據(jù),只需要調用 Queue_Clear 即可快速清空指定隊列,在創(chuàng)建隊列時會調用此函數(shù)來初始化隊列,因此對于剛創(chuàng)建完成的隊列無需調用清空隊列函數(shù)。

函數(shù)原型:

void?Queue_Clear(QUEUE_HandleTypeDef?*?hqueue)

參數(shù)說明:

參數(shù)名描述
hqueue需要清空的隊列結構。

2、獲取隊列數(shù)據(jù)數(shù)量

當需要獲取隊列中的數(shù)據(jù)長度時,調用 Queue_Count 函數(shù),函數(shù)原型如下:

unsigned?int?Queue_Count(QUEUE_HandleTypeDef?*?hqueue)

參數(shù)說明:

參數(shù)名描述
hqueue需要獲取數(shù)據(jù)長度的隊列結構。

返回值說明:

  • 該函數(shù)將返回隊列中的數(shù)據(jù)長度。

  • 返回值范圍在0到創(chuàng)建隊列時的長度之間。


—— The End?——

往期推薦

單片機開發(fā)從來不用數(shù)據(jù)結構?

寫爛代碼的人離職之后...

難倒高手了,c語言枚舉end的作用是什么?

30個單片機常見問題解決辦法!一般人我不告訴他們

馬斯克的腦機接口,一塊樹莓派就能做出來?

加入嵌入式技術交流群一起進步

點擊上方名片關注我

你點的每個好看,我都認真當成了喜歡

總結

以上是生活随笔為你收集整理的好项目,不私藏!适用于单片机开发的开源轮子的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。