<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          一個開源的MCU隊列功能模塊

          共 4250字,需瀏覽 9分鐘

           ·

          2022-04-26 07:48

          ????關注、星標公眾號,直達精彩內容

          來源網路素材

          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.

          免責聲明:本文素材來源網絡,版權歸原作者所有。如涉及作品版權問題,請與我聯(lián)系刪除。

          ???????????????? ?END ????????????????

          關注我的微信公眾號,回復“加群”按規(guī)則加入技術交流群。

          點擊下面圖片,有星球具體介紹,新用戶有新人優(yōu)惠券,老用戶半價優(yōu)惠,期待大家一起學習一起進步。


          點擊“閱讀原文”查看更多分享,歡迎點分享、收藏、點贊、在看。

          瀏覽 63
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  黄色免费国产 | 色婷婷粉嫩精品综合在线 | 国产在线拍揄自揄拍无码视频 | 免费高清无码在线 | 午夜影院久久 |