chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

單片機(jī)裸機(jī)實(shí)現(xiàn)隊(duì)列功能的方案

jf_pJlTbmA9 ? 來(lái)源:嵌入式大雜燴 ? 作者:嵌入式大雜燴 ? 2023-10-17 14:34 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

QueueForMcu

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

開(kā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ù)長(zhǎng)度

采用值傳遞的方式保存隊(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);
  }
}

三、配置說(shuō)明

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

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

四、數(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ì)列緩存長(zhǎng)度(初始化時(shí)賦值)
    QUEUE_DATA_T * buffer;                  //隊(duì)列緩存數(shù)組(初始化時(shí)賦值)
}QUEUE_HandleTypeDef;

其中 QUEUE_DATA_T 為配置項(xiàng)中自定義的數(shù)據(jù)類(lèi)型。

五、創(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)

接下來(lái)使用 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ù)來(lái)創(chuàng)建隊(duì)列,該函數(shù)原型如下:

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

參數(shù)說(shuō)明:

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

參考代碼:

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ù)說(shuō)明:

參數(shù)名 描述
hqueue 需要壓入數(shù)據(jù)的隊(duì)列結(jié)構(gòu)。
data 待壓入隊(duì)列的數(shù)據(jù)。

返回值說(shuō)明:

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

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

參考代碼:

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ù)來(lái)實(shí)現(xiàn)的,函數(shù)原型如下:

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

參數(shù)說(shuō)明:

參數(shù)名 描述
hqueue 需要壓入數(shù)據(jù)的隊(duì)列結(jié)構(gòu)。
pdatas 待壓入隊(duì)列的數(shù)組首地址。
len 待壓入隊(duì)列的數(shù)組長(zhǎng)度。

當(dāng)數(shù)組長(zhǎng)度大于隊(duì)列剩余長(zhǎng)度時(shí),數(shù)組多余的數(shù)據(jù)將被忽略。

返回值說(shuō)明:

該函數(shù)將返回實(shí)際被壓入到隊(duì)列中的數(shù)據(jù)長(zhǎng)度。

當(dāng)隊(duì)列中的剩余長(zhǎng)度富余時(shí),返回值將等于參數(shù)len的值。

當(dāng)隊(duì)列中的剩余長(zhǎng)度不足時(shí),返回值為實(shí)際被壓入到隊(duì)列的數(shù)據(jù)長(zhǎng)度。

七、彈出隊(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ù)說(shuō)明:

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

返回值說(shuō)明:

該函數(shù)會(huì)返回一個(gè) QUEUE_StatusTypeDef 枚舉數(shù)據(jù)類(lèi)型,返回值會(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ù)來(lái)實(shí)現(xiàn)的,需要注意的是,成功彈出的數(shù)據(jù)將從隊(duì)列中刪除,函數(shù)原型如下:

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

參數(shù)說(shuō)明:

參數(shù)名 描述
hqueue 需要彈出數(shù)據(jù)的隊(duì)列結(jié)構(gòu)。
pdatas 用于保存彈出數(shù)據(jù)數(shù)組的首地址。
len 需要彈出數(shù)據(jù)數(shù)組的長(zhǎng)度。

當(dāng)需要彈出數(shù)據(jù)的長(zhǎng)度大于隊(duì)列中的數(shù)據(jù)長(zhǎng)度時(shí),彈出數(shù)組多余的空間將不會(huì)被賦值。

返回值說(shuō)明:

該函數(shù)將返回實(shí)際從隊(duì)列中彈出的數(shù)據(jù)長(zhǎng)度。

當(dāng)隊(duì)列中的數(shù)據(jù)長(zhǎng)度足夠時(shí),返回值將等于參數(shù)len的值。

當(dāng)隊(duì)列中的數(shù)據(jù)長(zhǎng)度不足時(shí),返回值為實(shí)際從隊(duì)列中彈出的數(shù)據(jù)長(zhǎng)度。

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

當(dāng)需要從隊(duì)列頭部獲取數(shù)據(jù),但又不希望數(shù)據(jù)從隊(duì)列中刪除時(shí),可以使用 Queue_Peek 函數(shù)來(lái)實(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ù)來(lái)實(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í),無(wú)需彈出所有數(shù)據(jù),只需要調(diào)用 Queue_Clear 即可快速清空指定隊(duì)列,在創(chuàng)建隊(duì)列時(shí)會(huì)調(diào)用此函數(shù)來(lái)初始化隊(duì)列,因此對(duì)于剛創(chuàng)建完成的隊(duì)列無(wú)需調(diào)用清空隊(duì)列函數(shù)。

函數(shù)原型:

void Queue_Clear(QUEUE_HandleTypeDef * hqueue)

參數(shù)說(shuō)明:

參數(shù)名 描述
hqueue 需要清空的隊(duì)列結(jié)構(gòu)。

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

當(dāng)需要獲取隊(duì)列中的數(shù)據(jù)長(zhǎng)度時(shí),調(diào)用 Queue_Count 函數(shù),函數(shù)原型如下:

unsigned int Queue_Count(QUEUE_HandleTypeDef * hqueue)

參數(shù)說(shuō)明:

參數(shù)名 描述
hqueue 需要獲取數(shù)據(jù)長(zhǎng)度的隊(duì)列結(jié)構(gòu)。

返回值說(shuō)明:

該函數(shù)將返回隊(duì)列中的數(shù)據(jù)長(zhǎng)度。

返回值范圍在0到創(chuàng)建隊(duì)列時(shí)的長(zhǎng)度之間。

License

Copyright ? 2020 QueueForMcu Released under the GPL-3.0 License.

來(lái)源:嵌入式大雜燴
免責(zé)聲明:本文為轉(zhuǎn)載文章,轉(zhuǎn)載此文目的在于傳遞更多信息,版權(quán)歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權(quán)問(wèn)題,請(qǐng)聯(lián)系小編進(jìn)行處理

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 單片機(jī)
    +關(guān)注

    關(guān)注

    6071

    文章

    45256

    瀏覽量

    660104
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    一個(gè)適用于單片機(jī)裸機(jī)開(kāi)發(fā)的開(kāi)源輪子

    今天推薦一個(gè)適用于單片機(jī)裸機(jī)開(kāi)發(fā)的開(kāi)源輪子。
    發(fā)表于 07-04 18:38 ?2093次閱讀

    如何去實(shí)現(xiàn)STM32單片機(jī)裸機(jī)程序的實(shí)時(shí)性處理呢

    如何去實(shí)現(xiàn)STM32單片機(jī)裸機(jī)程序的實(shí)時(shí)性處理呢?怎樣去實(shí)現(xiàn)呢?
    發(fā)表于 11-16 08:20

    基于linux的單片機(jī)開(kāi)發(fā)和裸機(jī)開(kāi)發(fā)的區(qū)別

    1.基于linux的單片機(jī)開(kāi)發(fā)和裸機(jī)開(kāi)發(fā)的區(qū)別\qquad單片機(jī)裸機(jī)開(kāi)發(fā)和基于linux的單片機(jī)開(kāi)發(fā),是有這本質(zhì)的不同。\qquad
    發(fā)表于 11-19 08:21

    怎樣去使用基于單片機(jī)實(shí)現(xiàn)隊(duì)列功能模塊QueueForMcu呢

    基于單片機(jī)實(shí)現(xiàn)隊(duì)列功能模塊QueueForMcu有何特性?怎樣去使用基于單片機(jī)實(shí)現(xiàn)
    發(fā)表于 02-23 06:39

    linux的驅(qū)動(dòng)開(kāi)發(fā)——基于linux的單片機(jī)開(kāi)發(fā)簡(jiǎn)介

    1.基于linux的單片機(jī)開(kāi)發(fā)和裸機(jī)開(kāi)發(fā)的區(qū)別\qquad單片機(jī)裸機(jī)開(kāi)發(fā)和基于linux的單片機(jī)開(kāi)發(fā),是有這本質(zhì)的不同。\qquad
    發(fā)表于 11-13 11:21 ?7次下載
    linux的驅(qū)動(dòng)開(kāi)發(fā)——基于linux的<b class='flag-5'>單片機(jī)</b>開(kāi)發(fā)簡(jiǎn)介

    單片機(jī)開(kāi)發(fā)——應(yīng)用消息隊(duì)列處理事件

    單片機(jī)開(kāi)發(fā)——應(yīng)用消息隊(duì)列處理事件
    發(fā)表于 11-13 13:36 ?11次下載
    <b class='flag-5'>單片機(jī)</b>開(kāi)發(fā)——應(yīng)用消息<b class='flag-5'>隊(duì)列</b>處理事件

    單片機(jī)裸機(jī)程序框架

    單片機(jī)裸機(jī)程序框架##單片機(jī)裸機(jī)開(kāi)發(fā)時(shí),要處理多個(gè)任務(wù)程序框架:輪詢(xún)系統(tǒng)int main(void){ init_something(); while(1) { do_someth
    發(fā)表于 11-13 19:21 ?12次下載
    <b class='flag-5'>單片機(jī)</b><b class='flag-5'>裸機(jī)</b>程序框架

    單片機(jī)串口——隊(duì)列的使用

    背景??最近做單片機(jī)開(kāi)發(fā)經(jīng)常遇見(jiàn)要用串口接收數(shù)據(jù)的情況,實(shí)際項(xiàng)目中肯定不能當(dāng)串口接收中斷一來(lái)就去處理,于是我們可以用到隊(duì)列這個(gè)數(shù)據(jù)結(jié)構(gòu)來(lái)保存上一幀數(shù)據(jù),想用的時(shí)候取出即可。開(kāi)始新建隊(duì)列結(jié)構(gòu)體
    發(fā)表于 11-13 20:36 ?16次下載
    <b class='flag-5'>單片機(jī)</b>串口——<b class='flag-5'>隊(duì)列</b>的使用

    淺談單片機(jī)裸機(jī)系統(tǒng)程序框架

    淺談單片機(jī)裸機(jī)系統(tǒng)程序框架
    發(fā)表于 11-23 17:51 ?13次下載
    淺談<b class='flag-5'>單片機(jī)</b><b class='flag-5'>裸機(jī)</b>系統(tǒng)程序框架

    循環(huán)隊(duì)列原理及在單片機(jī)串口通訊的應(yīng)用(二)

    的使用 硬件環(huán)境 falling-star board(自設(shè)計(jì),下期開(kāi)源資料,主控STM32f103RET6) 軟件環(huán)境 keil5 cubemx cubemx配置1、 時(shí)鐘的配置,??無(wú)論什么平臺(tái),什么單片機(jī),第一步,我想都是要搞清楚時(shí)鐘,時(shí)鐘是一
    發(fā)表于 11-23 18:21 ?8次下載
    循環(huán)<b class='flag-5'>隊(duì)列</b>原理及在<b class='flag-5'>單片機(jī)</b>串口通訊的應(yīng)用(二)

    你的單片機(jī)裸機(jī)程序框架是怎樣的?

    前言前不久,我有位做測(cè)試的朋友轉(zhuǎn)去做開(kāi)發(fā)的工作,面試遇到了一個(gè)問(wèn)題,他沒(méi)明白,打電話(huà)問(wèn)了我。題目大概就是:在單片機(jī)裸機(jī)開(kāi)發(fā)時(shí),單片機(jī)要處理多個(gè)任務(wù),此時(shí)你的程序框架是怎樣的呢?這其實(shí)是個(gè)...
    發(fā)表于 11-26 13:21 ?13次下載
    你的<b class='flag-5'>單片機(jī)</b><b class='flag-5'>裸機(jī)</b>程序框架是怎樣的?

    QueueForMcu 基于單片機(jī)實(shí)現(xiàn)隊(duì)列功能模塊

    QueueForMcu基于單片機(jī)實(shí)現(xiàn)隊(duì)列功能模塊,主要用于8位、16位、32位非運(yùn)行RTOS的單片機(jī)應(yīng)用,兼容大多數(shù)
    發(fā)表于 12-31 19:35 ?1次下載
    QueueForMcu 基于<b class='flag-5'>單片機(jī)</b><b class='flag-5'>實(shí)現(xiàn)</b>的<b class='flag-5'>隊(duì)列</b><b class='flag-5'>功能</b>模塊

    單片機(jī)消息隊(duì)列實(shí)現(xiàn)原理和機(jī)制

    單片機(jī)開(kāi)發(fā)過(guò)程中通常會(huì)用到“消息隊(duì)列”,一般實(shí)現(xiàn)的方法有多種。 本文給大家分享一下隊(duì)列實(shí)現(xiàn)的原理和機(jī)制。
    的頭像 發(fā)表于 05-26 09:50 ?2216次閱讀
    <b class='flag-5'>單片機(jī)</b>消息<b class='flag-5'>隊(duì)列</b>的<b class='flag-5'>實(shí)現(xiàn)</b>原理和機(jī)制

    一種基于單片機(jī)實(shí)現(xiàn)隊(duì)列功能模塊

    基于單片機(jī)實(shí)現(xiàn)隊(duì)列功能模塊,主要用于8位、16位、32位非運(yùn)行RTOS的單片機(jī)應(yīng)用,兼容大多數(shù)單片機(jī)
    的頭像 發(fā)表于 08-14 11:09 ?1301次閱讀
    一種基于<b class='flag-5'>單片機(jī)</b><b class='flag-5'>實(shí)現(xiàn)</b>的<b class='flag-5'>隊(duì)列</b><b class='flag-5'>功能</b>模塊

    單片機(jī)(裸機(jī))程序一般怎么寫(xiě)?

    裸機(jī)(單片機(jī))程序主要是相對(duì)于基于操作系統(tǒng)的程序開(kāi)發(fā)而言,就是沒(méi)有操作系統(tǒng)的基礎(chǔ)上開(kāi)發(fā)具有特定功能的代碼。
    發(fā)表于 09-05 16:48 ?2460次閱讀
    <b class='flag-5'>單片機(jī)</b>(<b class='flag-5'>裸機(jī)</b>)程序一般怎么寫(xiě)?