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

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

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

詳細(xì)了解隊(duì)列的特點(diǎn)及用處

嵌入式應(yīng)用開發(fā) ? 來源:嵌入式應(yīng)用開發(fā) ? 作者:嵌入式應(yīng)用開發(fā) ? 2022-05-31 15:25 ? 次閱讀

隊(duì)列的特點(diǎn):

先進(jìn)先出,隊(duì)列是一種操作受限的線性表,其限制條件為允許在表的一端進(jìn)行插入,而在表的另一端進(jìn)行刪除。插入的一端叫做隊(duì)尾,刪除的一端叫做隊(duì)頭。向隊(duì)列中插入新元素的行為稱為進(jìn)隊(duì),從隊(duì)列中刪除元素的行為稱為出隊(duì)。一般用法在隊(duì)頭插入,在隊(duì)尾刪除。

隊(duì)列終究它就是個(gè)buf,buf就是存東西的,保存不丟失,可以理解為在buf上封裝了一些操作。

隊(duì)列的用處:

1、用于任務(wù)間通信,尤其對(duì)于單任務(wù)系統(tǒng),多個(gè)任務(wù)都操作一個(gè)隊(duì)列,比如,A任務(wù)往隊(duì)列里扔數(shù)據(jù),B任務(wù)負(fù)責(zé)檢查隊(duì)列,只要有數(shù)據(jù)就進(jìn)行處理,起到了兩個(gè)任務(wù)通信的效果,同樣可以把這個(gè)數(shù)據(jù)理解為消息,A任務(wù)給B任務(wù)發(fā)消息,B任務(wù)根據(jù)不同的消息(數(shù)據(jù))做不同的處理。

2、緩沖數(shù)據(jù)。最常見的就是串口接收數(shù)據(jù),搞一個(gè)環(huán)形buf隊(duì)列,收到數(shù)據(jù)就放到這個(gè)隊(duì)列中,當(dāng)然這個(gè)buf肯定是有長度的,不能一直存儲(chǔ)數(shù)據(jù)。正常用法下,得及時(shí)讀取走,這樣就能一直接收數(shù)據(jù)不丟失。

隊(duì)列的幾個(gè)基本的使用包括:

  1. 隊(duì)列的創(chuàng)建;
  2. 隊(duì)列的添加元素,刪除元素,提取元素等對(duì)隊(duì)列的操作;

隊(duì)列的創(chuàng)建:首先定義一個(gè)隊(duì)列的大小,這里直接定義為int型數(shù)組,最大存儲(chǔ)6個(gè)元素。定義一個(gè)結(jié)構(gòu)體存放隊(duì)列的信息,包括數(shù)組的指針,用于后續(xù)對(duì)數(shù)組的操作,定義好結(jié)構(gòu)體后對(duì)結(jié)構(gòu)體進(jìn)行初始化

int queuebuffer[6]={0};typedef struct _Tag_My_Queue_{   int *buffer;   unsigned char In;   unsigned char Out;   int queueSize;}my_queue;void queueInit(my_queue *queue,int *buffer,int bufferSize){   queue->buffer = buffer;   queue->In = 0;   queue->Out = 0;   queue->queueSize = bufferSize;}

隊(duì)列空間 與隊(duì)列數(shù)據(jù)數(shù)量的函數(shù)如下:

int queue_space(my_queue *queue){    int size =queue->queueSize;    int num = queue->Out;    while(num != queue->In)    {        size--;        num = (num + 1)%queue->queueSize;    }    return size - 1;}//queue data numbersint queue_deep(my_queue *queue){    int size = 0;    int num = queue->Out;    while(num != queue->In)    {        size++;        num = (num + 1)%queue->queueSize;    }    return size;}

如果要對(duì)隊(duì)列增加和刪除元素要進(jìn)行隊(duì)列的相關(guān)操作。定義函數(shù)如下:

int addDataToQueue(my_queue *queue,int data){   if(queue_full(queue))   {       printf("queue already full!!!\n");       return 0;   }   queue->buffer[queue->In] = data;     queue->In = (queue->In + 1) % queue->queueSize;   return 1;}int deleteDataFromQueue(my_queue *queue,int *data){   if(queue_empty(queue))   {       printf("queue already empty!!!\n");       return 0;   }   *data = queue->buffer[queue->Out];   queue->Out = (queue->Out + 1) % queue->queueSize;   return 1;}

隊(duì)列生成后要進(jìn)行隊(duì)列的元素判斷,隊(duì)列是否為空,或者是否隊(duì)列已滿,定義函數(shù)如下:

int addDataToQueue(my_queue *queue,int data){   if(queue_full(queue))   {       printf("queue already full!!!\n");       return 0;   }   queue->buffer[queue->In] = data;     queue->In = (queue->In + 1) % queue->queueSize;   return 1;}int deleteDataFromQueue(my_queue *queue,int *data){   if(queue_empty(queue))   {       printf("queue already empty!!!\n");       return 0;   }   *data = queue->buffer[queue->Out];   queue->Out = (queue->Out + 1) % queue->queueSize;   return 1;}

下面就對(duì)隊(duì)列 的數(shù)據(jù)進(jìn)行相關(guān)的操作,包括增加數(shù)據(jù)入隊(duì)列,數(shù)據(jù)出隊(duì)列等相關(guān)的操做,運(yùn)行函數(shù)觀察運(yùn)行起來的狀態(tài)。

void main(){   my_queue testqueue;   int data;   queueInit(&testqueue,queuebuffer,sizeof(queuebuffer)/sizeof(queuebuffer[0]));   addDataToQueue(&testqueue,55);   addDataToQueue(&testqueue,3);   addDataToQueue(&testqueue,2);   addDataToQueue(&testqueue,33);   addDataToQueue(&testqueue,6);printf("queue data is %d\r\n",queue_print(&testqueue));   printf("---queue deep:%d\n",queue_deep(&testqueue));   printf("---queue space:%d\n",queue_space(&testqueue));   deleteDataFromQueue(&testqueue,&data);   printf("data:%d\n",data);   deleteDataFromQueue(&testqueue,&data);   printf("data:%d\n",data);   deleteDataFromQueue(&testqueue,&data);   printf("data:%d\n",data);   deleteDataFromQueue(&testqueue,&data);   printf("data:%d\n",data);   printf("---queue deep:%d\n",queue_deep(&testqueue));   printf("---queue space:%d\n",queue_space(&testqueue));   deleteDataFromQueue(&testqueue,&data);   printf("data:%d\n",data);   addDataToQueue(&testqueue,45);   addDataToQueue(&testqueue,22);   addDataToQueue(&testqueue,33);   deleteDataFromQueue(&testqueue,&data);   printf("data:%d\n",data);   printf("data:%d\n",deleteDataFromQueue(&testqueue,&data));   printf("---queue deep:%d\n",queue_deep(&testqueue));   printf("---queue space:%d\n",queue_space(&testqueue));   queue_print(&testqueue);   printf("In:%d,Out:%d\n",testqueue.In,testqueue.Out);while(1);}

運(yùn)行結(jié)果如下圖所示:

poYBAGKUgcmAfgcpAABhQIfmPK0474.png運(yùn)行結(jié)果

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

    關(guān)注

    8

    文章

    6762

    瀏覽量

    88629
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4262

    瀏覽量

    62236
  • 隊(duì)列
    +關(guān)注

    關(guān)注

    1

    文章

    46

    瀏覽量

    10878
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Labview Queue State Machine(隊(duì)列狀態(tài)機(jī))

    本帖最后由 eehome 于 2013-1-5 10:02 編輯 下面是一個(gè)Sample,想要詳細(xì)了解,請(qǐng)回帖,我們一起學(xué)習(xí)……
    發(fā)表于 07-06 16:16

    用VDK+BF537開發(fā)產(chǎn)品中,想詳細(xì)了解一下VDK中事件、事件bit、信號(hào)量的使用方法,以及如何寫自己的device drivers

    用VDK+BF537開發(fā)產(chǎn)品中,想詳細(xì)了解一下VDK中事件、事件bit、信號(hào)量的使用方法,以及如何寫自己的device drivers。請(qǐng)問哪有針對(duì)上述問題的資料下載?
    發(fā)表于 12-06 09:19

    請(qǐng)大神通俗易懂的描述一下隊(duì)列以及狀態(tài)機(jī)用處和用法

    一直沒太搞明白隊(duì)列用處和用法,請(qǐng)問是控制流程使用的嗎?我有一個(gè)設(shè)備需要進(jìn)行1,2,3,4,5個(gè)步驟需要執(zhí)行,但是執(zhí)行哪幾個(gè)有我選定,這個(gè)時(shí)候就可以用隊(duì)列,狀態(tài)機(jī)是吧?具體怎么用有人能介紹一下嗎???
    發(fā)表于 12-24 13:42

    關(guān)于藍(lán)牙模塊基礎(chǔ)知識(shí)點(diǎn)介紹的太詳細(xì)了

    關(guān)于藍(lán)牙模塊基礎(chǔ)知識(shí)點(diǎn)介紹的太詳細(xì)了
    發(fā)表于 10-08 06:56

    詳細(xì)了解下ups的相關(guān)計(jì)算

    關(guān)于ups方面的計(jì)算有很多,ups無論是接空開,還是連接電纜,以及選擇電池,都可能需要計(jì)算它的電流或功率等,那么今天我們來詳細(xì)了解下ups的相關(guān)計(jì)算。一、UPS電源及電流一、高頻ups與工頻ups
    發(fā)表于 11-16 09:08

    嵌入式軟件中的隊(duì)列有何特點(diǎn)

    數(shù)據(jù)結(jié)構(gòu)之隊(duì)列篇1 隊(duì)列特點(diǎn)及在嵌入式軟件中的應(yīng)用隊(duì)列(queue)是一個(gè)簡單線性表,它是一個(gè)允許在一端進(jìn)行插入操作,而在另一端進(jìn)行刪除操作的線性表。
    發(fā)表于 12-21 07:28

    詳細(xì)了解一下STM32F1的具體電路參數(shù)

    最近筆者在使用STM32時(shí),需要詳細(xì)了解一下F1的具體電路參數(shù)。于是查看其官方數(shù)據(jù)手冊(cè),結(jié)果記錄如下。絕對(duì)最大額度值一般工作條件表中的FT指5V 耐壓??梢栽谝_定義表格中看到。I/O端口特性(邏輯電平)在最后一個(gè)表格中還可以看到STMF103芯片內(nèi)部的上/下拉電阻的阻值為40k。...
    發(fā)表于 01-18 07:07

    通過 iftop、 nethogs 和 vnstat 詳細(xì)了解你的網(wǎng)絡(luò)連接狀態(tài)

    通過 iftop、 nethogs 和 vnstat 詳細(xì)了解你的網(wǎng)絡(luò)連接狀態(tài)。
    的頭像 發(fā)表于 01-27 21:10 ?2.1w次閱讀
    通過 iftop、 nethogs 和 vnstat <b class='flag-5'>詳細(xì)了解</b>你的網(wǎng)絡(luò)連接狀態(tài)

    TI官網(wǎng)的中文詳細(xì)概述帶你了解TI官網(wǎng)用處

    本文的主要內(nèi)容介紹的是TI的官網(wǎng)中文詳細(xì)概述帶你了解TI官網(wǎng)用處
    發(fā)表于 04-23 15:39 ?43次下載
    TI官網(wǎng)的中文<b class='flag-5'>詳細(xì)</b>概述帶你<b class='flag-5'>了解</b>TI官網(wǎng)<b class='flag-5'>用處</b>

    什么是優(yōu)先隊(duì)列?漫畫形式帶你詳細(xì)了解優(yōu)先隊(duì)列

    這一次,我們來講一講二叉堆的另外一個(gè)應(yīng)用:優(yōu)先隊(duì)列
    的頭像 發(fā)表于 10-03 20:10 ?8015次閱讀

    詳細(xì)了解卡爾曼濾波器

    在這篇文章的結(jié)尾,您將對(duì)KF的工作原理,其背后的想法,為什么需要多個(gè)變體以及最常見的變體有一個(gè)直觀而詳細(xì)了解。
    的頭像 發(fā)表于 05-03 18:31 ?2824次閱讀
    <b class='flag-5'>詳細(xì)了解</b>卡爾曼濾波器

    一文詳細(xì)了解OpenHarmony新圖形框架

    3月30日,OpenHarmony v3.1 Release版本正式發(fā)布了。此版本為大家?guī)砹巳碌膱D形框架,實(shí)現(xiàn)了UI框架顯示、多窗口、流暢動(dòng)畫等基礎(chǔ)能力,夯實(shí)了OpenHarmony系統(tǒng)能力基座。下面就帶大家詳細(xì)了解新圖形框架。
    的頭像 發(fā)表于 04-27 13:21 ?2060次閱讀
    一文<b class='flag-5'>詳細(xì)了解</b>OpenHarmony新圖形框架

    帶您一起詳細(xì)了解IEEE802.3bt(PoE++)的有關(guān)特點(diǎn)

    Hqst華強(qiáng)盛(盈盛電子)導(dǎo)讀:帶您一起詳細(xì)了解IEEE802.3bt(PoE++)的有關(guān)特點(diǎn),讓我們對(duì)IEEE802.3bt(PoE++)協(xié)議有更具體的了解
    的頭像 發(fā)表于 01-04 11:26 ?1824次閱讀
    帶您一起<b class='flag-5'>詳細(xì)了解</b>IEEE802.3bt(PoE++)的有關(guān)<b class='flag-5'>特點(diǎn)</b>

    一文帶你詳細(xì)了解工業(yè)電腦

    扇設(shè)計(jì)、承受振動(dòng)和惡劣環(huán)境的能力、輕松配置、全面的I/O選項(xiàng)、延長生命周期、耐用的組件。了解如何為您的應(yīng)用選擇工業(yè)電腦對(duì)提高設(shè)施的生產(chǎn)力和效率至關(guān)重要。詳細(xì)了解
    的頭像 發(fā)表于 06-12 14:24 ?287次閱讀
    一文帶你<b class='flag-5'>詳細(xì)了解</b>工業(yè)電腦

    嵌入式環(huán)形隊(duì)列與消息隊(duì)列的實(shí)現(xiàn)原理

    嵌入式環(huán)形隊(duì)列,也稱為環(huán)形緩沖區(qū)或循環(huán)隊(duì)列,是一種先進(jìn)先出(FIFO)的數(shù)據(jù)結(jié)構(gòu),用于在固定大小的存儲(chǔ)區(qū)域中高效地存儲(chǔ)和訪問數(shù)據(jù)。其主要特點(diǎn)包括固定大小的數(shù)組和兩個(gè)指針(頭指針和尾指針),分別指向
    的頭像 發(fā)表于 09-02 15:29 ?226次閱讀