在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

單片機裸機實現隊列功能的方案

jf_pJlTbmA9 ? 來源:嵌入式大雜燴 ? 作者:嵌入式大雜燴 ? 2023-10-17 14:34 ? 次閱讀

QueueForMcu

基于單片機實現的隊列功能模塊,主要用于8位、16位、32位非運行RTOS的單片機應用,兼容大多數單片機平臺。

開源代碼:https://github.com/xiaoxinpro/QueueForMcu

一、特性

動態創建隊列對象

動態設置隊列數據緩沖區

靜態指定隊列元素數據長度

采用值傳遞的方式保存隊列數據

二、快速使用

#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只有一個靜態配置項,具體如下:

在文件 queue.h 中有一個宏定義 QUEUE_DATA_T 用于指定隊列元素的數據長度,默認是 unsigned char ,可以根據需要更改為其他數據類型。

四、數據結構

隊列的數據結構為 QUEUE_HandleTypeDef 用于保存隊列的狀態,源碼如下:

typedef struct QUEUE_HandleTypeDef{
    unsigned int head;                      //隊列頭指針
    unsigned int tail;                      //隊列尾指針
    unsigned int buffer_length;             //隊列緩存長度(初始化時賦值)
    QUEUE_DATA_T * buffer;                  //隊列緩存數組(初始化時賦值)
}QUEUE_HandleTypeDef;

其中 QUEUE_DATA_T 為配置項中自定義的數據類型。

五、創建隊列

1、創建隊列緩存

由于我們采用值傳遞的方式保存隊列數據,因此我們在創建隊列前要手動創建一個隊列緩存區,用于存放隊列數據。

QUEUE_DATA_T BufferUartTx[1024];

以上代碼即創建一個大小為 1024 的隊列緩存區。

2、創建隊列結構

接下來使用 QUEUE_HandleTypeDef 創建隊列結構,用于保存隊列的狀態:

QUEUE_HandleTypeDef qUartTx;

3、初始化隊列

準備好隊列緩存和隊列結構后調用 Queue_Init 函數來創建隊列,該函數原型如下:

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

參數說明:

參數名 描述
hqueue 需要初始化的隊列結構,如果二次初始化將清空原隊列的內容。
buffer 隊列緩存的首地址指針
len 隊列長度,不能比隊列緩存長度還要大。

參考代碼:

Queue_Init( qUartTx, BufferUartTx, Q_UART_BUFFER_SIZE);

六、壓入隊列

1、單數據壓入

將數據壓入隊列尾部使用 Queue_Push 函數,該函數原型如下:

QUEUE_StatusTypeDef Queue_Push(QUEUE_HandleTypeDef * hqueue, QUEUE_DATA_T data)

參數說明:

參數名 描述
hqueue 需要壓入數據的隊列結構。
data 待壓入隊列的數據。

返回值說明:

該函數會返回一個 QUEUE_StatusTypeDef 枚舉數據類型,返回值會根據隊列狀態返回以下幾個值:

返回值 描述
QUEUE_OK 數據壓入隊列成功。
QUEUE_OVERLOAD 未壓入數據到隊列中,原因隊列已滿。

參考代碼:

Queue_Push( qUartTx, 'Q');
Queue_Push( qUartTx, 0x51);
Queue_Push( qUartTx, 81);

2、多數據壓入

若需要將多個數據(數組)壓入隊列可以使用 Queue_Push_Array 函數,原理上循環調用 Queue_Push 函數來實現的,函數原型如下:

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

參數說明:

參數名 描述
hqueue 需要壓入數據的隊列結構。
pdatas 待壓入隊列的數組首地址。
len 待壓入隊列的數組長度。

當數組長度大于隊列剩余長度時,數組多余的數據將被忽略。

返回值說明:

該函數將返回實際被壓入到隊列中的數據長度。

當隊列中的剩余長度富余時,返回值將等于參數len的值。

當隊列中的剩余長度不足時,返回值為實際被壓入到隊列的數據長度。

七、彈出隊列

1、單數據彈出

將隊列頭部數據彈出隊列使用 Queue_Pop 函數,需要注意的是,彈出的數據將從隊列中刪除,該函數原型如下:

QUEUE_StatusTypeDef Queue_Pop(QUEUE_HandleTypeDef * hqueue, QUEUE_DATA_T * pdata)

參數說明:

參數名 描述
hqueue 需要彈出數據的隊列結構。
pdata 用于保存彈出數據變量的指針。

返回值說明:

該函數會返回一個 QUEUE_StatusTypeDef 枚舉數據類型,返回值會根據隊列狀態返回以下幾個值:

返回值 描述
QUEUE_OK 數據彈出隊列成功。
QUEUE_VOID 未彈出數據到隊列中,原因隊列為空。

參考代碼:

QUEUE_DATA_T temp;
if(QUEUE_OK = Queue_Pop( qUartTx,  temp))
{
    // temp 為隊列彈出的數據
}
else
{
    // 彈出數據失敗
}

2、多數據彈出

若需要將多個數據彈出隊列可以使用 Queue_Pop_Array 函數,原理上循環調用 Queue_Pop 函數來實現的,需要注意的是,成功彈出的數據將從隊列中刪除,函數原型如下:

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

參數說明:

參數名 描述
hqueue 需要彈出數據的隊列結構。
pdatas 用于保存彈出數據數組的首地址。
len 需要彈出數據數組的長度。

當需要彈出數據的長度大于隊列中的數據長度時,彈出數組多余的空間將不會被賦值。

返回值說明:

該函數將返回實際從隊列中彈出的數據長度。

當隊列中的數據長度足夠時,返回值將等于參數len的值。

當隊列中的數據長度不足時,返回值為實際從隊列中彈出的數據長度。

3、單數據復制

當需要從隊列頭部獲取數據,但又不希望數據從隊列中刪除時,可以使用 Queue_Peek 函數來實現,該函數的參數與返回值與 Queue_Pop 完全相同。

使用 Queue_Peek 和 Queue_Pop 函數的區別在于:

Queue_Pop得到隊列中的數據后會刪除隊列中的數據。

Queue_Peek得到隊列中的數據后會保留隊列中的數據。

4、多數據復制

當需要從隊列頭部獲取多個數據,但又不希望數據從隊列中刪除時,可以使用 Queue_Peek_Array 函數來實現,該函數的參數與返回值與 Queue_Pop_Array 完全相同。

使用 Queue_Peek_Array 和 Queue_Pop_Array 函數的區別在于:

Queue_Pop_Array得到隊列中的數據后會刪除隊列中的數據。

Queue_Peek_Array得到隊列中的數據后會保留隊列中的數據。

八、其他功能

1、清空隊列

當需要清空隊列數據時,無需彈出所有數據,只需要調用 Queue_Clear 即可快速清空指定隊列,在創建隊列時會調用此函數來初始化隊列,因此對于剛創建完成的隊列無需調用清空隊列函數。

函數原型:

void Queue_Clear(QUEUE_HandleTypeDef * hqueue)

參數說明:

參數名 描述
hqueue 需要清空的隊列結構。

2、獲取隊列數據數量

當需要獲取隊列中的數據長度時,調用 Queue_Count 函數,函數原型如下:

unsigned int Queue_Count(QUEUE_HandleTypeDef * hqueue)

參數說明:

參數名 描述
hqueue 需要獲取數據長度的隊列結構。

返回值說明:

該函數將返回隊列中的數據長度。

返回值范圍在0到創建隊列時的長度之間。

License

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

來源:嵌入式大雜燴
免責聲明:本文為轉載文章,轉載此文目的在于傳遞更多信息,版權歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權問題,請聯系小編進行處理

審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 單片機
    +關注

    關注

    6044

    文章

    44627

    瀏覽量

    638969
收藏 人收藏

    評論

    相關推薦

    一個適用于單片機裸機開發的開源輪子

    今天推薦一個適用于單片機裸機開發的開源輪子。
    發表于 07-04 18:38 ?1860次閱讀

    如何去實現STM32單片機裸機程序的實時性處理呢

    如何去實現STM32單片機裸機程序的實時性處理呢?怎樣去實現呢?
    發表于 11-16 08:20

    基于linux的單片機開發和裸機開發的區別

    1.基于linux的單片機開發和裸機開發的區別\qquad單片機裸機開發和基于linux的單片機開發,是有這本質的不同。\qquad
    發表于 11-19 08:21

    怎樣去使用基于單片機實現隊列功能模塊QueueForMcu呢

    基于單片機實現隊列功能模塊QueueForMcu有何特性?怎樣去使用基于單片機實現
    發表于 02-23 06:39

    linux的驅動開發——基于linux的單片機開發簡介

    1.基于linux的單片機開發和裸機開發的區別\qquad單片機裸機開發和基于linux的單片機開發,是有這本質的不同。\qquad
    發表于 11-13 11:21 ?7次下載
    linux的驅動開發——基于linux的<b class='flag-5'>單片機</b>開發簡介

    單片機開發——應用消息隊列處理事件

    單片機開發——應用消息隊列處理事件
    發表于 11-13 13:36 ?11次下載
    <b class='flag-5'>單片機</b>開發——應用消息<b class='flag-5'>隊列</b>處理事件

    單片機裸機程序框架

    單片機裸機程序框架##單片機裸機開發時,要處理多個任務程序框架:輪詢系統int main(void){ init_something(); while(1) { do_someth
    發表于 11-13 19:21 ?12次下載
    <b class='flag-5'>單片機</b><b class='flag-5'>裸機</b>程序框架

    單片機串口——隊列的使用

    背景??最近做單片機開發經常遇見要用串口接收數據的情況,實際項目中肯定不能當串口接收中斷一來就去處理,于是我們可以用到隊列這個數據結構來保存上一幀數據,想用的時候取出即可。開始新建隊列結構體
    發表于 11-13 20:36 ?16次下載
    <b class='flag-5'>單片機</b>串口——<b class='flag-5'>隊列</b>的使用

    淺談單片機裸機系統程序框架

    淺談單片機裸機系統程序框架
    發表于 11-23 17:51 ?13次下載
    淺談<b class='flag-5'>單片機</b><b class='flag-5'>裸機</b>系統程序框架

    你的單片機裸機程序框架是怎樣的?

    前言前不久,我有位做測試的朋友轉去做開發的工作,面試遇到了一個問題,他沒明白,打電話問了我。題目大概就是:在單片機裸機開發時,單片機要處理多個任務,此時你的程序框架是怎樣的呢?這其實是個...
    發表于 11-26 13:21 ?13次下載
    你的<b class='flag-5'>單片機</b><b class='flag-5'>裸機</b>程序框架是怎樣的?

    QueueForMcu 基于單片機實現隊列功能模塊

    QueueForMcu基于單片機實現隊列功能模塊,主要用于8位、16位、32位非運行RTOS的單片機應用,兼容大多數
    發表于 12-31 19:35 ?1次下載
    QueueForMcu 基于<b class='flag-5'>單片機</b><b class='flag-5'>實現</b>的<b class='flag-5'>隊列</b><b class='flag-5'>功能</b>模塊

    拍拍燈單片機方案,輕拍即可開關燈

    芯嶺技術開發設計的拍拍燈解決方案使用了NY8A062D單片機這款單片機,低成本、高性能。方案通過工程師使用單片機程序開發設計而成,該拍拍燈
    的頭像 發表于 04-22 16:49 ?4718次閱讀

    單片機消息隊列實現原理和機制

    單片機開發過程中通常會用到“消息隊列”,一般實現的方法有多種。 本文給大家分享一下隊列實現的原理和機制。
    的頭像 發表于 05-26 09:50 ?1659次閱讀
    <b class='flag-5'>單片機</b>消息<b class='flag-5'>隊列</b>的<b class='flag-5'>實現</b>原理和機制

    一種基于單片機實現隊列功能模塊

    基于單片機實現隊列功能模塊,主要用于8位、16位、32位非運行RTOS的單片機應用,兼容大多數單片機
    的頭像 發表于 08-14 11:09 ?924次閱讀
    一種基于<b class='flag-5'>單片機</b><b class='flag-5'>實現</b>的<b class='flag-5'>隊列</b><b class='flag-5'>功能</b>模塊

    單片機(裸機)程序一般怎么寫?

    裸機(單片機)程序主要是相對于基于操作系統的程序開發而言,就是沒有操作系統的基礎上開發具有特定功能的代碼。
    發表于 09-05 16:48 ?1465次閱讀
    <b class='flag-5'>單片機</b>(<b class='flag-5'>裸機</b>)程序一般怎么寫?
    主站蜘蛛池模板: 一区二区三区四区视频 | 欧美激情在线 | 四虎4hu影库免费永久国产 | 99久久99这里只有免费费精品 | 好吊色视频988gao在线观看 | 久久综合九九亚洲一区 | 婷婷免费高清视频在线观看 | 日本国产在线 | 久久中文字幕一区二区 | 美日韩一区二区 | 1024手机免费看片 | 黄.www| 国产精品9999久久久久仙踪林 | 免费观看视频在线 | 免费啪视频 | 天天曰夜夜操 | 都市激情 亚洲 | china3p单男精品自拍 | 亚偷熟乱区视频在线观看 | 人人洗澡人人洗澡人人 | 色多多免费观看在线 | 午夜在线视频免费 | 黄色网在线播放 | 亚洲午夜久久久精品影院视色 | 欧美色视频在线 | 免费看18污黄 | 色在线视频播放 | 婷婷色在线播放 | 91久久麻豆 | 欧美一级欧美三级在线观看 | 中文4480yy私人免费影院 | 四虎comwww最新地址 | 99久久国产免费中文无字幕 | 黄a大片 | 天堂资源www天堂在线 | 色天天天天 | 天堂bt在线| 天天插综合| 欧美精品成人a多人在线观看 | 91在线视频免费 | 干干干操操操 |