一個開源的MCU隊列功能模塊
來源:網路素材
QueueForMcu
基于單片機實現(xiàn)的隊列功能模塊,主要用于8位、16位、32位非運行RTOS的單片機應用,兼容大多數(shù)單片機平臺。
開源代碼:https://github.com/xiaoxinpro/QueueForMcu
一、特性
動態(tài)創(chuàng)建隊列對象 動態(tài)設置隊列數(shù)據緩沖區(qū) 靜態(tài)指定隊列元素數(shù)據長度 采用值傳遞的方式保存隊列數(shù)據
二、快速使用
#include?"queue.h"
#define?Q_UART_BUFFER_SIZE??1024
QUEUE_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ù)據長度,默認是?unsigned char?,可以根據需要更改為其他數(shù)據類型。
四、數(shù)據結構
隊列的數(shù)據結構為?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ù)據類型。
五、創(chuàng)建隊列
1、創(chuàng)建隊列緩存
由于我們采用值傳遞的方式保存隊列數(shù)據,因此我們在創(chuàng)建隊列前要手動創(chuàng)建一個隊列緩存區(qū),用于存放隊列數(shù)據。
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 | 需要初始化的隊列結構,如果二次初始化將清空原隊列的內容。 |
| buffer | 隊列緩存的首地址指針 |
| len | 隊列長度,不能比隊列緩存長度還要大。 |
參考代碼:
Queue_Init(&qUartTx,?BufferUartTx,?Q_UART_BUFFER_SIZE);
六、壓入隊列
1、單數(shù)據壓入
將數(shù)據壓入隊列尾部使用?Queue_Push?函數(shù),該函數(shù)原型如下:
QUEUE_StatusTypeDef?Queue_Push(QUEUE_HandleTypeDef?*?hqueue,?QUEUE_DATA_T?data)
參數(shù)說明:
| 參數(shù)名 | 描述 |
|---|---|
| hqueue | 需要壓入數(shù)據的隊列結構。 |
| data | 待壓入隊列的數(shù)據。 |
返回值說明:
該函數(shù)會返回一個?QUEUE_StatusTypeDef?枚舉數(shù)據類型,返回值會根據隊列狀態(tài)返回以下幾個值:
| 返回值 | 描述 |
|---|---|
| QUEUE_OK | 數(shù)據壓入隊列成功。 |
| QUEUE_OVERLOAD | 未壓入數(shù)據到隊列中,原因隊列已滿。 |
參考代碼:
Queue_Push(&qUartTx,?'Q');
Queue_Push(&qUartTx,?0x51);
Queue_Push(&qUartTx,?81);
2、多數(shù)據壓入
若需要將多個數(shù)據(數(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ù)據的隊列結構。 |
| pdatas | 待壓入隊列的數(shù)組首地址。 |
| len | 待壓入隊列的數(shù)組長度。 |
當數(shù)組長度大于隊列剩余長度時,數(shù)組多余的數(shù)據將被忽略。
返回值說明:
該函數(shù)將返回實際被壓入到隊列中的數(shù)據長度。
當隊列中的剩余長度富余時,返回值將等于參數(shù)?
len?的值。當隊列中的剩余長度不足時,返回值為實際被壓入到隊列的數(shù)據長度。
七、彈出隊列
1、單數(shù)據彈出
將隊列頭部數(shù)據彈出隊列使用?Queue_Pop?函數(shù),需要注意的是,彈出的數(shù)據將從隊列中刪除,該函數(shù)原型如下:
QUEUE_StatusTypeDef?Queue_Pop(QUEUE_HandleTypeDef?*?hqueue,?QUEUE_DATA_T?*?pdata)
參數(shù)說明:
| 參數(shù)名 | 描述 |
|---|---|
| hqueue | 需要彈出數(shù)據的隊列結構。 |
| pdata | 用于保存彈出數(shù)據變量的指針。 |
返回值說明:
該函數(shù)會返回一個?QUEUE_StatusTypeDef?枚舉數(shù)據類型,返回值會根據隊列狀態(tài)返回以下幾個值:
| 返回值 | 描述 |
|---|---|
| QUEUE_OK | 數(shù)據彈出隊列成功。 |
| QUEUE_VOID | 未彈出數(shù)據到隊列中,原因隊列為空。 |
參考代碼:
QUEUE_DATA_T?temp;
if(QUEUE_OK?=?Queue_Pop(&qUartTx,?&temp))
{
????//?temp?為隊列彈出的數(shù)據
}
else
{
????//?彈出數(shù)據失敗
}
2、多數(shù)據彈出
若需要將多個數(shù)據彈出隊列可以使用?Queue_Pop_Array?函數(shù),原理上循環(huán)調用?Queue_Pop?函數(shù)來實現(xiàn)的,需要注意的是,成功彈出的數(shù)據將從隊列中刪除,函數(shù)原型如下:
unsigned?int?Queue_Pop_Array(QUEUE_HandleTypeDef?*?hqueue,?QUEUE_DATA_T?*?pdatas,?unsigned?int?len)
參數(shù)說明:
| 參數(shù)名 | 描述 |
|---|---|
| hqueue | 需要彈出數(shù)據的隊列結構。 |
| pdatas | 用于保存彈出數(shù)據數(shù)組的首地址。 |
| len | 需要彈出數(shù)據數(shù)組的長度。 |
當需要彈出數(shù)據的長度大于隊列中的數(shù)據長度時,彈出數(shù)組多余的空間將不會被賦值。
返回值說明:
該函數(shù)將返回實際從隊列中彈出的數(shù)據長度。
當隊列中的數(shù)據長度足夠時,返回值將等于參數(shù)?
len?的值。當隊列中的數(shù)據長度不足時,返回值為實際從隊列中彈出的數(shù)據長度。
3、單數(shù)據復制
當需要從隊列頭部獲取數(shù)據,但又不希望數(shù)據從隊列中刪除時,可以使用?Queue_Peek?函數(shù)來實現(xiàn),該函數(shù)的參數(shù)與返回值與?Queue_Pop?完全相同。
使用?Queue_Peek?和?Queue_Pop?函數(shù)的區(qū)別在于:
Queue_Pop?得到隊列中的數(shù)據后會刪除隊列中的數(shù)據。Queue_Peek?得到隊列中的數(shù)據后會保留隊列中的數(shù)據。
4、多數(shù)據復制
當需要從隊列頭部獲取多個數(shù)據,但又不希望數(shù)據從隊列中刪除時,可以使用?Queue_Peek_Array?函數(shù)來實現(xiàn),該函數(shù)的參數(shù)與返回值與?Queue_Pop_Array?完全相同。
使用?Queue_Peek_Array?和?Queue_Pop_Array?函數(shù)的區(qū)別在于:
Queue_Pop_Array?得到隊列中的數(shù)據后會刪除隊列中的數(shù)據。Queue_Peek_Array?得到隊列中的數(shù)據后會保留隊列中的數(shù)據。
八、其他功能
1、清空隊列
當需要清空隊列數(shù)據時,無需彈出所有數(shù)據,只需要調用?Queue_Clear?即可快速清空指定隊列,在創(chuàng)建隊列時會調用此函數(shù)來初始化隊列,因此對于剛創(chuàng)建完成的隊列無需調用清空隊列函數(shù)。
函數(shù)原型:
void?Queue_Clear(QUEUE_HandleTypeDef?*?hqueue)
參數(shù)說明:
| 參數(shù)名 | 描述 |
|---|---|
| hqueue | 需要清空的隊列結構。 |
2、獲取隊列數(shù)據數(shù)量
當需要獲取隊列中的數(shù)據長度時,調用?Queue_Count?函數(shù),函數(shù)原型如下:
unsigned?int?Queue_Count(QUEUE_HandleTypeDef?*?hqueue)
參數(shù)說明:
| 參數(shù)名 | 描述 |
|---|---|
| hqueue | 需要獲取數(shù)據長度的隊列結構。 |
返回值說明:
該函數(shù)將返回隊列中的數(shù)據長度。 返回值范圍在0到創(chuàng)建隊列時的長度之間。
License
Copyright ? 2020 QueueForMcu Released under the GPL-3.0 License.
???????????????? ?END ????????????????
關注我的微信公眾號,回復“加群”按規(guī)則加入技術交流群。
點擊下面圖片,有星球具體介紹,新用戶有新人優(yōu)惠券,老用戶半價優(yōu)惠,期待大家一起學習一起進步。
點擊“閱讀原文”查看更多分享,歡迎點分享、收藏、點贊、在看。
