91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

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

CHANBAEK ? 來(lái)源:網(wǎng)絡(luò)整理 ? 作者:網(wǎng)絡(luò)整理 ? 2024-09-02 15:29 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

嵌入式環(huán)形隊(duì)列,也稱為環(huán)形緩沖區(qū)或循環(huán)隊(duì)列,是一種先進(jìn)先出(FIFO)的數(shù)據(jù)結(jié)構(gòu),用于在固定大小的存儲(chǔ)區(qū)域中高效地存儲(chǔ)和訪問(wèn)數(shù)據(jù)。其主要特點(diǎn)包括固定大小的數(shù)組和兩個(gè)指針(頭指針和尾指針),分別指向隊(duì)列的起始位置和結(jié)束位置。

1. 數(shù)據(jù)結(jié)構(gòu)定義

環(huán)形隊(duì)列通常由以下幾個(gè)部分組成:

  • 固定大小的數(shù)組 :作為存儲(chǔ)數(shù)據(jù)的緩沖區(qū)。
  • 頭指針(head :指向隊(duì)列的第一個(gè)有效數(shù)據(jù)元素。
  • 尾指針(tail) :指向隊(duì)列中下一個(gè)將要插入數(shù)據(jù)的位置。
2. 操作原理
  • 入隊(duì)操作 :將新數(shù)據(jù)插入到尾指針指向的位置,然后將尾指針向前移動(dòng)一位。如果尾指針到達(dá)數(shù)組末尾,則循環(huán)回到數(shù)組的起始位置。在入隊(duì)前,需要檢查隊(duì)列是否已滿(即尾指針的下一個(gè)位置是否等于頭指針)。
  • 出隊(duì)操作 :將頭指針指向的數(shù)據(jù)元素移除,并將頭指針向前移動(dòng)一位。如果頭指針到達(dá)數(shù)組末尾,則循環(huán)回到數(shù)組的起始位置。在出隊(duì)前,需要檢查隊(duì)列是否為空(即頭指針是否等于尾指針)。
3. 隊(duì)列滿與空的判斷
  • 隊(duì)列滿 :當(dāng)尾指針的下一個(gè)位置等于頭指針時(shí),表示隊(duì)列已滿,無(wú)法再添加新元素。
  • 隊(duì)列空 :當(dāng)頭指針等于尾指針時(shí),表示隊(duì)列為空,沒(méi)有元素可以出隊(duì)。
4. 示例代碼(C語(yǔ)言
#define QUEUE_SIZE 10  
int queue[QUEUE_SIZE];  
int head = 0;  
int tail = 0;  
  
void enqueue(int data) {  
    if ((tail + 1) % QUEUE_SIZE == head) {  
        // 隊(duì)列已滿  
        return;  
    }  
    queue[tail] = data;  
    tail = (tail + 1) % QUEUE_SIZE;  
}  
  
int dequeue() {  
    if (head == tail) {  
        // 隊(duì)列為空  
        return -1;  
    }  
    int data = queue[head];  
    head = (head + 1) % QUEUE_SIZE;  
    return data;  
}  
  
int queue_size() {  
    return (tail - head + QUEUE_SIZE) % QUEUE_SIZE;  
}

二、消息隊(duì)列的實(shí)現(xiàn)原理

消息隊(duì)列是一種多個(gè)發(fā)送者和接收者之間共享數(shù)據(jù)的通信機(jī)制,允許多個(gè)任務(wù)或線程向隊(duì)列發(fā)送消息,并允許多個(gè)任務(wù)或線程從隊(duì)列中接收消息。消息隊(duì)列通常用于處理異步事件和任務(wù)之間的通信。

1. 數(shù)據(jù)結(jié)構(gòu)定義

消息隊(duì)列通常由以下幾個(gè)部分組成:

  • 消息隊(duì)列緩沖區(qū) :用于存儲(chǔ)消息,可以是動(dòng)態(tài)分配的數(shù)組或鏈表。
  • 頭指針和尾指針 :分別指向隊(duì)列的第一個(gè)有效消息和下一個(gè)將要插入消息的位置。
  • 消息結(jié)構(gòu) :每個(gè)消息通常包含固定大小和格式的數(shù)據(jù),以及可能的元數(shù)據(jù)(如消息長(zhǎng)度、優(yōu)先級(jí)等)。
2. 操作原理
  • 入隊(duì)操作 :將新消息添加到隊(duì)列的末尾,并更新尾指針。如果隊(duì)列已滿,則可能需要根據(jù)隊(duì)列的策略(如阻塞、丟棄舊消息等)進(jìn)行處理。
  • 出隊(duì)操作 :從隊(duì)列的頭部移除消息,并更新頭指針。如果隊(duì)列為空,則可能需要根據(jù)隊(duì)列的策略(如阻塞、返回錯(cuò)誤碼等)進(jìn)行處理。
3. 同步與并發(fā)控制

在多線程或多任務(wù)環(huán)境中,消息隊(duì)列的訪問(wèn)需要同步控制,以防止數(shù)據(jù)競(jìng)爭(zhēng)和不一致性。通常使用互斥鎖、信號(hào)量等同步機(jī)制來(lái)保護(hù)隊(duì)列的共享資源。

4. 示例場(chǎng)景
  • 網(wǎng)絡(luò)通信 :在網(wǎng)絡(luò)通信協(xié)議中,消息隊(duì)列用于緩存和傳輸數(shù)據(jù)包。
  • 任務(wù)調(diào)度 :在操作系統(tǒng)嵌入式系統(tǒng)中,消息隊(duì)列用于任務(wù)之間的通信和調(diào)度。
  • 異步處理 :在需要異步處理的應(yīng)用場(chǎng)景中,消息隊(duì)列作為緩沖和調(diào)度機(jī)制,提高系統(tǒng)的響應(yīng)性和吞吐量。

三、嵌入式環(huán)形隊(duì)列與消息隊(duì)列的異同

1. 相同點(diǎn)
  • 數(shù)據(jù)結(jié)構(gòu)基礎(chǔ) :兩者都基于隊(duì)列的數(shù)據(jù)結(jié)構(gòu),遵循先進(jìn)先出(FIFO)的原則。
  • 緩存機(jī)制 :都用于在內(nèi)存中緩存數(shù)據(jù),以減少對(duì)外部存儲(chǔ)或傳輸設(shè)備的依賴。
  • 應(yīng)用場(chǎng)景 :都廣泛應(yīng)用于嵌入式系統(tǒng)、網(wǎng)絡(luò)通信、任務(wù)調(diào)度等領(lǐng)域。
2. 不同點(diǎn)
嵌入式環(huán)形隊(duì)列消息隊(duì)列
存儲(chǔ)結(jié)構(gòu)固定大小的數(shù)組,通過(guò)頭尾指針實(shí)現(xiàn)環(huán)形存儲(chǔ)動(dòng)態(tài)或靜態(tài)分配的緩沖區(qū),支持更復(fù)雜的數(shù)據(jù)結(jié)構(gòu)和元數(shù)據(jù)
數(shù)據(jù)組織簡(jiǎn)單,僅存儲(chǔ)數(shù)據(jù)本身復(fù)雜,每個(gè)消息可能包含數(shù)據(jù)、長(zhǎng)度、優(yōu)先級(jí)等元信息
隊(duì)列管理側(cè)重于隊(duì)列的滿空判斷、循環(huán)使用空間側(cè)重于消息的同步控制、并發(fā)訪問(wèn)、消息優(yōu)先級(jí)等
應(yīng)用場(chǎng)景適用于資源受限的嵌入式系統(tǒng),如UART、CAN等通信協(xié)議的數(shù)據(jù)緩存適用于需要異步處理、任務(wù)調(diào)度、網(wǎng)絡(luò)通信等復(fù)雜場(chǎng)景
擴(kuò)展性擴(kuò)展性有限,受限于固定大小的數(shù)組擴(kuò)展性好,可以通過(guò)動(dòng)態(tài)分配緩沖區(qū)來(lái)適應(yīng)不同規(guī)模的數(shù)據(jù)傳輸
RTOS依賴相對(duì)獨(dú)立,不直接依賴于RTOS通常與RTOS結(jié)合使用,以充分利用RTOS的同步和調(diào)度機(jī)制

綜上所述,嵌入式環(huán)形隊(duì)列和消息隊(duì)列在實(shí)現(xiàn)原理和應(yīng)用場(chǎng)景上各有特點(diǎn)。嵌入式環(huán)形隊(duì)列以其簡(jiǎn)潔高效的存儲(chǔ)結(jié)構(gòu)和操作方式,在資源受限的嵌入式系統(tǒng)中得到廣泛應(yīng)用;而消息隊(duì)列則以其強(qiáng)大的同步控制、并發(fā)訪問(wèn)和擴(kuò)展性,在需要異步處理、任務(wù)調(diào)度和網(wǎng)絡(luò)通信等復(fù)雜場(chǎng)景中發(fā)揮重要作用。在實(shí)際應(yīng)用中,應(yīng)根據(jù)具體需求和系統(tǒng)環(huán)境選擇合適的隊(duì)列實(shí)現(xiàn)方式。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(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)投訴
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    嵌入式開(kāi)發(fā)中消息隊(duì)列實(shí)現(xiàn)

    嵌入式開(kāi)發(fā)中經(jīng)常會(huì)看到消息隊(duì)列的身影,隊(duì)列的應(yīng)用是很廣泛的,它可以應(yīng)用的場(chǎng)景有很多,比如緩存通信消息,暫存執(zhí)行內(nèi)容,數(shù)據(jù)順序轉(zhuǎn)發(fā)等的操作。
    發(fā)表于 08-22 11:19 ?1835次閱讀
    <b class='flag-5'>嵌入式</b>開(kāi)發(fā)中消息<b class='flag-5'>隊(duì)列</b>的<b class='flag-5'>實(shí)現(xiàn)</b>

    基于STM32的串口環(huán)形隊(duì)列IAP調(diào)試

    基于STM32的串口環(huán)形隊(duì)列IAP調(diào)試心得
    的頭像 發(fā)表于 09-18 15:33 ?2700次閱讀
    基于STM32的串口<b class='flag-5'>環(huán)形</b><b class='flag-5'>隊(duì)列</b>IAP調(diào)試

    環(huán)形隊(duì)列在串口數(shù)據(jù)接收中的使用

    前言??書接上回,前文主要介紹了環(huán)形隊(duì)列實(shí)現(xiàn)原理以及C語(yǔ)言實(shí)現(xiàn)及測(cè)試過(guò)程,本文將回歸到嵌入式平臺(tái)的應(yīng)用中,話不多說(shuō),淦,上干貨!實(shí)驗(yàn)?zāi)康腍
    發(fā)表于 12-06 06:27

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

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

    實(shí)現(xiàn)隊(duì)列環(huán)形緩沖的方法

    串口隊(duì)列環(huán)形緩沖區(qū)隊(duì)列串口環(huán)形緩沖的好處代碼實(shí)現(xiàn)隊(duì)列??要實(shí)
    發(fā)表于 02-21 07:11

    環(huán)形隊(duì)列的相關(guān)資料分享

    前言??當(dāng)代碼,不再是簡(jiǎn)單的完成需求,對(duì)代碼進(jìn)行堆砌,而是開(kāi)始思考如何寫出優(yōu)美代碼的時(shí)候,我們的代碼水平必然會(huì)不斷提升,今天,咱們來(lái)學(xué)習(xí)環(huán)形隊(duì)列結(jié)構(gòu)。環(huán)形隊(duì)列的基本概念??相信對(duì)數(shù)據(jù)結(jié)
    發(fā)表于 02-23 06:10

    環(huán)形隊(duì)列的操作如何去實(shí)現(xiàn)

    環(huán)形隊(duì)列結(jié)構(gòu)的定義是什么?環(huán)形隊(duì)列的操作如何去實(shí)現(xiàn)呢?
    發(fā)表于 02-25 06:35

    基于環(huán)形隊(duì)列的串口打印阻塞解決方法

    隊(duì)列(FIFO)是一種常見(jiàn)的線性存儲(chǔ)結(jié)構(gòu),在嵌入式開(kāi)發(fā)中經(jīng)常用到,主要的應(yīng)用場(chǎng)景有:
    的頭像 發(fā)表于 01-22 09:47 ?3520次閱讀
    基于<b class='flag-5'>環(huán)形</b><b class='flag-5'>隊(duì)列</b>的串口打印阻塞解決方法

    深度解析數(shù)據(jù)結(jié)構(gòu)與算法篇之隊(duì)列環(huán)形隊(duì)列實(shí)現(xiàn)

    的位置。 02 — 環(huán)形隊(duì)列實(shí)現(xiàn) 要想將元素放入隊(duì)列我們必須知道對(duì)頭和隊(duì)尾,在隊(duì)列長(zhǎng)度不能無(wú)限大的條件下我們還要知道
    的頭像 發(fā)表于 06-18 10:07 ?2580次閱讀

    TencentOS-tiny中環(huán)形隊(duì)列實(shí)現(xiàn)

    1. 什么是隊(duì)列隊(duì)列(queue)是一種只能在一端插入元素、在另一端刪除元素的數(shù)據(jù)結(jié)構(gòu),遵循「先入先出」(FIFO)的規(guī)則。 隊(duì)列中有兩個(gè)基本概念: 隊(duì)頭指針(可變):永遠(yuǎn)指向此隊(duì)列的第一個(gè)數(shù)據(jù)元素
    的頭像 發(fā)表于 10-08 16:30 ?2006次閱讀

    STM32串口環(huán)形緩沖--使用隊(duì)列實(shí)現(xiàn)(開(kāi)放源碼)

    串口隊(duì)列環(huán)形緩沖區(qū)隊(duì)列串口環(huán)形緩沖的好處代碼實(shí)現(xiàn)隊(duì)列??要實(shí)
    發(fā)表于 12-24 19:04 ?28次下載
    STM32串口<b class='flag-5'>環(huán)形</b>緩沖--使用<b class='flag-5'>隊(duì)列</b><b class='flag-5'>實(shí)現(xiàn)</b>(開(kāi)放源碼)

    基于STM32的串口環(huán)形隊(duì)列IAP調(diào)試心得

    使用環(huán)形隊(duì)列,簡(jiǎn)單點(diǎn)說(shuō)就是個(gè)環(huán)形數(shù)組,一邊接收上位機(jī)數(shù)據(jù),一邊往flash里面寫。
    發(fā)表于 02-08 15:22 ?5次下載
    基于STM32的串口<b class='flag-5'>環(huán)形</b><b class='flag-5'>隊(duì)列</b>IAP調(diào)試心得

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

    嵌入式環(huán)形隊(duì)列和消息隊(duì)列實(shí)現(xiàn)數(shù)據(jù)緩存和通信的常見(jiàn)數(shù)據(jù)結(jié)構(gòu),廣泛應(yīng)用于嵌入式系統(tǒng)中的通信協(xié)議和領(lǐng)
    的頭像 發(fā)表于 04-14 11:52 ?2548次閱讀

    嵌入式環(huán)形隊(duì)列和消息隊(duì)列是如何去實(shí)現(xiàn)的?

    嵌入式環(huán)形隊(duì)列和消息隊(duì)列實(shí)現(xiàn)數(shù)據(jù)緩存和通信的常見(jiàn)數(shù)據(jù)結(jié)構(gòu),廣泛應(yīng)用于嵌入式系統(tǒng)中的通信協(xié)議和領(lǐng)
    發(fā)表于 05-20 14:55 ?1729次閱讀

    裸機(jī)中環(huán)形隊(duì)列與RTOS中消息隊(duì)列有何區(qū)別呢?

    環(huán)形隊(duì)列”和“消息隊(duì)列”在嵌入式領(lǐng)域有應(yīng)用非常廣泛,相信有經(jīng)驗(yàn)的嵌入式軟件工程師對(duì)它們都不陌生。
    的頭像 發(fā)表于 01-26 09:38 ?1526次閱讀
    裸機(jī)中<b class='flag-5'>環(huán)形</b><b class='flag-5'>隊(duì)列</b>與RTOS中消息<b class='flag-5'>隊(duì)列</b>有何區(qū)別呢?