今天推薦一個(gè)適用于單片機(jī)裸機(jī)開發(fā)的開源輪子。
QueueForMcu
基于單片機(jī)實(shí)現(xiàn)的隊(duì)列功能模塊,主要用于8位、16位、32位非運(yùn)行RTOS的單片機(jī)應(yīng)用,兼容大多數(shù)單片機(jī)平臺(tái)。
開源代碼:https://github.com/xiaoxinpro/QueueForMcu
一、特性
- 動(dòng)態(tài)創(chuàng)建隊(duì)列對(duì)象
- 動(dòng)態(tài)設(shè)置隊(duì)列數(shù)據(jù)緩沖區(qū)
- 靜態(tài)指定隊(duì)列元素?cái)?shù)據(jù)長度
- 采用值傳遞的方式保存隊(duì)列數(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;
??
??//初始化隊(duì)列
??Queue_Init(&qUartTx,?BufferUartTx,?Q_UART_BUFFER_SIZE);
??
??while(1)
??{
????//入隊(duì)
????Queue_Push(&qUartTx,?'Q');
????Queue_Push(&qUartTx,?'u');
????Queue_Push(&qUartTx,?'e');
????Queue_Push(&qUartTx,?'u');
????Queue_Push(&qUartTx,?'e');
????
????//出隊(duì)
????Queue_Pop(&qUartTx,?&temp);
????Queue_Pop(&qUartTx,?&temp);
????Queue_Pop(&qUartTx,?&temp);
????Queue_Pop(&qUartTx,?&temp);
????Queue_Pop(&qUartTx,?&temp);
??}
}
三、配置說明
目前QueueForMcu只有一個(gè)靜態(tài)配置項(xiàng),具體如下:
在文件 queue.h
中有一個(gè)宏定義 QUEUE_DATA_T
用于指定隊(duì)列元素的數(shù)據(jù)長度,默認(rèn)是 unsigned char
,可以根據(jù)需要更改為其他數(shù)據(jù)類型。
四、數(shù)據(jù)結(jié)構(gòu)
隊(duì)列的數(shù)據(jù)結(jié)構(gòu)為 QUEUE_HandleTypeDef
用于保存隊(duì)列的狀態(tài),源碼如下:
typedef?struct?QUEUE_HandleTypeDef{
????unsigned?int?head;??????????????????????//隊(duì)列頭指針
????unsigned?int?tail;??????????????????????//隊(duì)列尾指針
????unsigned?int?buffer_length;?????????????//隊(duì)列緩存長度(初始化時(shí)賦值)
????QUEUE_DATA_T?*?buffer;??????????????????//隊(duì)列緩存數(shù)組(初始化時(shí)賦值)
}QUEUE_HandleTypeDef;
其中 QUEUE_DATA_T
為配置項(xiàng)中自定義的數(shù)據(jù)類型。
五、創(chuàng)建隊(duì)列
1、創(chuàng)建隊(duì)列緩存
由于我們采用值傳遞的方式保存隊(duì)列數(shù)據(jù),因此我們?cè)趧?chuàng)建隊(duì)列前要手動(dòng)創(chuàng)建一個(gè)隊(duì)列緩存區(qū),用于存放隊(duì)列數(shù)據(jù)。
QUEUE_DATA_T?BufferUartTx[1024];
以上代碼即創(chuàng)建一個(gè)大小為 1024
的隊(duì)列緩存區(qū)。
2、創(chuàng)建隊(duì)列結(jié)構(gòu)
接下來使用 QUEUE_HandleTypeDef
創(chuàng)建隊(duì)列結(jié)構(gòu),用于保存隊(duì)列的狀態(tài):
QUEUE_HandleTypeDef?qUartTx;
3、初始化隊(duì)列
準(zhǔn)備好隊(duì)列緩存和隊(duì)列結(jié)構(gòu)后調(diào)用 Queue_Init
函數(shù)來創(chuàng)建隊(duì)列,該函數(shù)原型如下:
void?Queue_Init(QUEUE_HandleTypeDef?*?hqueue,?QUEUE_DATA_T?*?buffer,?unsigned?int?len)
參數(shù)說明:
參數(shù)名 | 描述 |
---|---|
hqueue | 需要初始化的隊(duì)列結(jié)構(gòu),如果二次初始化將清空原隊(duì)列的內(nèi)容。 |
buffer | 隊(duì)列緩存的首地址指針 |
len | 隊(duì)列長度,不能比隊(duì)列緩存長度還要大。 |
參考代碼:
Queue_Init(&qUartTx,?BufferUartTx,?Q_UART_BUFFER_SIZE);
六、壓入隊(duì)列
1、單數(shù)據(jù)壓入
將數(shù)據(jù)壓入隊(duì)列尾部使用 Queue_Push
函數(shù),該函數(shù)原型如下:
QUEUE_StatusTypeDef?Queue_Push(QUEUE_HandleTypeDef?*?hqueue,?QUEUE_DATA_T?data)
參數(shù)說明:
參數(shù)名 | 描述 |
---|---|
hqueue | 需要壓入數(shù)據(jù)的隊(duì)列結(jié)構(gòu)。 |
data | 待壓入隊(duì)列的數(shù)據(jù)。 |
返回值說明:
該函數(shù)會(huì)返回一個(gè) QUEUE_StatusTypeDef
枚舉數(shù)據(jù)類型,返回值會(huì)根據(jù)隊(duì)列狀態(tài)返回以下幾個(gè)值:
返回值 | 描述 |
---|---|
QUEUE_OK | 數(shù)據(jù)壓入隊(duì)列成功。 |
QUEUE_OVERLOAD | 未壓入數(shù)據(jù)到隊(duì)列中,原因隊(duì)列已滿。 |
參考代碼:
Queue_Push(&qUartTx,?'Q');
Queue_Push(&qUartTx,?0x51);
Queue_Push(&qUartTx,?81);
2、多數(shù)據(jù)壓入
若需要將多個(gè)數(shù)據(jù)(數(shù)組)壓入隊(duì)列可以使用 Queue_Push_Array
函數(shù),原理上循環(huán)調(diào)用 Queue_Push
函數(shù)來實(shí)現(xiàn)的,函數(shù)原型如下:
unsigned?int?Queue_Push_Array(QUEUE_HandleTypeDef?*?hqueue,?QUEUE_DATA_T?*?pdatas,?unsigned?int?len)
參數(shù)說明:
參數(shù)名 | 描述 |
---|---|
hqueue | 需要壓入數(shù)據(jù)的隊(duì)列結(jié)構(gòu)。 |
pdatas | 待壓入隊(duì)列的數(shù)組首地址。 |
len | 待壓入隊(duì)列的數(shù)組長度。 |
當(dāng)數(shù)組長度大于隊(duì)列剩余長度時(shí),數(shù)組多余的數(shù)據(jù)將被忽略。
返回值說明:
-
該函數(shù)將返回實(shí)際被壓入到隊(duì)列中的數(shù)據(jù)長度。
-
當(dāng)隊(duì)列中的剩余長度富余時(shí),返回值將等于參數(shù)
len
的值。 -
當(dāng)隊(duì)列中的剩余長度不足時(shí),返回值為實(shí)際被壓入到隊(duì)列的數(shù)據(jù)長度。
七、彈出隊(duì)列
1、單數(shù)據(jù)彈出
將隊(duì)列頭部數(shù)據(jù)彈出隊(duì)列使用 Queue_Pop
函數(shù),需要注意的是,彈出的數(shù)據(jù)將從隊(duì)列中刪除,該函數(shù)原型如下:
QUEUE_StatusTypeDef?Queue_Pop(QUEUE_HandleTypeDef?*?hqueue,?QUEUE_DATA_T?*?pdata)
參數(shù)說明:
參數(shù)名 | 描述 |
---|---|
hqueue | 需要彈出數(shù)據(jù)的隊(duì)列結(jié)構(gòu)。 |
pdata | 用于保存彈出數(shù)據(jù)變量的指針。 |
返回值說明:
該函數(shù)會(huì)返回一個(gè) QUEUE_StatusTypeDef
枚舉數(shù)據(jù)類型,返回值會(huì)根據(jù)隊(duì)列狀態(tài)返回以下幾個(gè)值:
返回值 | 描述 |
---|---|
QUEUE_OK | 數(shù)據(jù)彈出隊(duì)列成功。 |
QUEUE_VOID | 未彈出數(shù)據(jù)到隊(duì)列中,原因隊(duì)列為空。 |
參考代碼:
QUEUE_DATA_T?temp;
if(QUEUE_OK?=?Queue_Pop(&qUartTx,?&temp))
{
????//?temp?為隊(duì)列彈出的數(shù)據(jù)
}
else
{
????//?彈出數(shù)據(jù)失敗
}
2、多數(shù)據(jù)彈出
若需要將多個(gè)數(shù)據(jù)彈出隊(duì)列可以使用 Queue_Pop_Array
函數(shù),原理上循環(huán)調(diào)用 Queue_Pop
函數(shù)來實(shí)現(xiàn)的,需要注意的是,成功彈出的數(shù)據(jù)將從隊(duì)列中刪除,函數(shù)原型如下:
unsigned?int?Queue_Pop_Array(QUEUE_HandleTypeDef?*?hqueue,?QUEUE_DATA_T?*?pdatas,?unsigned?int?len)
參數(shù)說明:
參數(shù)名 | 描述 |
---|---|
hqueue | 需要彈出數(shù)據(jù)的隊(duì)列結(jié)構(gòu)。 |
pdatas | 用于保存彈出數(shù)據(jù)數(shù)組的首地址。 |
len | 需要彈出數(shù)據(jù)數(shù)組的長度。 |
當(dāng)需要彈出數(shù)據(jù)的長度大于隊(duì)列中的數(shù)據(jù)長度時(shí),彈出數(shù)組多余的空間將不會(huì)被賦值。
返回值說明:
-
該函數(shù)將返回實(shí)際從隊(duì)列中彈出的數(shù)據(jù)長度。
-
當(dāng)隊(duì)列中的數(shù)據(jù)長度足夠時(shí),返回值將等于參數(shù)
len
的值。 -
當(dāng)隊(duì)列中的數(shù)據(jù)長度不足時(shí),返回值為實(shí)際從隊(duì)列中彈出的數(shù)據(jù)長度。
3、單數(shù)據(jù)復(fù)制
當(dāng)需要從隊(duì)列頭部獲取數(shù)據(jù),但又不希望數(shù)據(jù)從隊(duì)列中刪除時(shí),可以使用 Queue_Peek
函數(shù)來實(shí)現(xiàn),該函數(shù)的參數(shù)與返回值與 Queue_Pop
完全相同。
使用 Queue_Peek
和 Queue_Pop
函數(shù)的區(qū)別在于:
-
Queue_Pop
得到隊(duì)列中的數(shù)據(jù)后會(huì)刪除隊(duì)列中的數(shù)據(jù)。 -
Queue_Peek
得到隊(duì)列中的數(shù)據(jù)后會(huì)保留隊(duì)列中的數(shù)據(jù)。
4、多數(shù)據(jù)復(fù)制
當(dāng)需要從隊(duì)列頭部獲取多個(gè)數(shù)據(jù),但又不希望數(shù)據(jù)從隊(duì)列中刪除時(shí),可以使用 Queue_Peek_Array
函數(shù)來實(shí)現(xiàn),該函數(shù)的參數(shù)與返回值與 Queue_Pop_Array
完全相同。
使用 Queue_Peek_Array
和 Queue_Pop_Array
函數(shù)的區(qū)別在于:
-
Queue_Pop_Array
得到隊(duì)列中的數(shù)據(jù)后會(huì)刪除隊(duì)列中的數(shù)據(jù)。 -
Queue_Peek_Array
得到隊(duì)列中的數(shù)據(jù)后會(huì)保留隊(duì)列中的數(shù)據(jù)。
八、其他功能
1、清空隊(duì)列
當(dāng)需要清空隊(duì)列數(shù)據(jù)時(shí),無需彈出所有數(shù)據(jù),只需要調(diào)用 Queue_Clear
即可快速清空指定隊(duì)列,在創(chuàng)建隊(duì)列時(shí)會(huì)調(diào)用此函數(shù)來初始化隊(duì)列,因此對(duì)于剛創(chuàng)建完成的隊(duì)列無需調(diào)用清空隊(duì)列函數(shù)。
函數(shù)原型:
void?Queue_Clear(QUEUE_HandleTypeDef?*?hqueue)
參數(shù)說明:
參數(shù)名 | 描述 |
---|---|
hqueue | 需要清空的隊(duì)列結(jié)構(gòu)。 |
2、獲取隊(duì)列數(shù)據(jù)數(shù)量
當(dāng)需要獲取隊(duì)列中的數(shù)據(jù)長度時(shí),調(diào)用 Queue_Count
函數(shù),函數(shù)原型如下:
unsigned?int?Queue_Count(QUEUE_HandleTypeDef?*?hqueue)
參數(shù)說明:
參數(shù)名 | 描述 |
---|---|
hqueue | 需要獲取數(shù)據(jù)長度的隊(duì)列結(jié)構(gòu)。 |
返回值說明:
該函數(shù)將返回隊(duì)列中的數(shù)據(jù)長度。 返回值范圍在0到創(chuàng)建隊(duì)列時(shí)的長度之間。 ?
評(píng)論
查看更多