基于單片機實現(xiàn)的隊列功能模塊,主要用于8位、16位、32位非運行RTOS的單片機應(yīng)用,兼容大多數(shù)單片機平臺。
開源代碼:https://github.com/xiaoxinpro/QueueForMcu
一、特性
動態(tài)創(chuàng)建隊列對象
動態(tài)設(shè)置隊列數(shù)據(jù)緩沖區(qū)
靜態(tài)指定隊列元素數(shù)據(jù)長度
采用值傳遞的方式保存隊列數(shù)據(jù)
二、快速使用
#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ù)據(jù)長度,默認是 unsigned char ,可以根據(jù)需要更改為其他數(shù)據(jù)類型。
四、數(shù)據(jù)結(jié)構(gòu)
隊列的數(shù)據(jù)結(jié)構(gòu)為 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)建隊列結(jié)構(gòu)
接下來使用 QUEUE_HandleTypeDef 創(chuàng)建隊列結(jié)構(gòu),用于保存隊列的狀態(tài):
QUEUE_HandleTypeDef qUartTx;
3、初始化隊列
準備好隊列緩存和隊列結(jié)構(gòu)后調(diào)用 Queue_Init 函數(shù)來創(chuàng)建隊列,該函數(shù)原型如下:
void Queue_Init(QUEUE_HandleTypeDef * hqueue, QUEUE_DATA_T * buffer, unsigned int len)
參數(shù)說明:
參數(shù)名 | 描述 |
---|---|
hqueue | 需要初始化的隊列結(jié)構(gòu),如果二次初始化將清空原隊列的內(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ù)的隊列結(jié)構(gòu)。 |
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)調(diào)用 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ù)的隊列結(jié)構(gòu)。 |
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ù)的隊列結(jié)構(gòu)。 |
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)調(diào)用 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ù)的隊列結(jié)構(gòu)。 |
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ù)復(fù)制
當需要從隊列頭部獲取數(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ù)復(fù)制
當需要從隊列頭部獲取多個數(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ù),只需要調(diào)用 Queue_Clear 即可快速清空指定隊列,在創(chuàng)建隊列時會調(diào)用此函數(shù)來初始化隊列,因此對于剛創(chuàng)建完成的隊列無需調(diào)用清空隊列函數(shù)。
函數(shù)原型:
void Queue_Clear(QUEUE_HandleTypeDef * hqueue)
參數(shù)說明:
參數(shù)名 | 描述 |
---|---|
hqueue | 需要清空的隊列結(jié)構(gòu)。 |
2、獲取隊列數(shù)據(jù)數(shù)量
當需要獲取隊列中的數(shù)據(jù)長度時,調(diào)用 Queue_Count 函數(shù),函數(shù)原型如下:
unsigned int Queue_Count(QUEUE_HandleTypeDef * hqueue)
參數(shù)說明:
參數(shù)名 | 描述 |
---|---|
hqueue | 需要獲取數(shù)據(jù)長度的隊列結(jié)構(gòu)。 |
返回值說明:
該函數(shù)將返回隊列中的數(shù)據(jù)長度。
返回值范圍在0到創(chuàng)建隊列時的長度之間。
License
Copyright ? 2020 QueueForMcu Released under the GPL-3.0 License.
來源:嵌入式大雜燴
免責聲明:本文為轉(zhuǎn)載文章,轉(zhuǎn)載此文目的在于傳遞更多信息,版權(quán)歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權(quán)問題,請聯(lián)系小編進行處理
審核編輯 黃宇
-
單片機
+關(guān)注
關(guān)注
6037文章
44558瀏覽量
635284
發(fā)布評論請先 登錄
相關(guān)推薦
評論