0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

嵌入式环形队列与消息队列的实现原理

CHANBAEK 来源:网络整理 作者:网络整理 2024-09-02 15:29 次阅读

一、嵌入式环形队列的实现原理

嵌入式环形队列,也称为环形缓冲区或循环队列,是一种先进先出(FIFO)的数据结构,用于在固定大小的存储区域中高效地存储和访问数据。其主要特点包括固定大小的数组和两个指针(头指针和尾指针),分别指向队列的起始位置和结束位置。

1. 数据结构定义

环形队列通常由以下几个部分组成:

  • 固定大小的数组 :作为存储数据的缓冲区。
  • 头指针(head :指向队列的第一个有效数据元素。
  • 尾指针(tail) :指向队列中下一个将要插入数据的位置。
2. 操作原理
  • 入队操作 :将新数据插入到尾指针指向的位置,然后将尾指针向前移动一位。如果尾指针到达数组末尾,则循环回到数组的起始位置。在入队前,需要检查队列是否已满(即尾指针的下一个位置是否等于头指针)。
  • 出队操作 :将头指针指向的数据元素移除,并将头指针向前移动一位。如果头指针到达数组末尾,则循环回到数组的起始位置。在出队前,需要检查队列是否为空(即头指针是否等于尾指针)。
3. 队列满与空的判断
  • 队列满 :当尾指针的下一个位置等于头指针时,表示队列已满,无法再添加新元素。
  • 队列空 :当头指针等于尾指针时,表示队列为空,没有元素可以出队。
4. 示例代码(C语言
#define QUEUE_SIZE 10  
int queue[QUEUE_SIZE];  
int head = 0;  
int tail = 0;  
  
void enqueue(int data) {  
    if ((tail + 1) % QUEUE_SIZE == head) {  
        // 队列已满  
        return;  
    }  
    queue[tail] = data;  
    tail = (tail + 1) % QUEUE_SIZE;  
}  
  
int dequeue() {  
    if (head == tail) {  
        // 队列为空  
        return -1;  
    }  
    int data = queue[head];  
    head = (head + 1) % QUEUE_SIZE;  
    return data;  
}  
  
int queue_size() {  
    return (tail - head + QUEUE_SIZE) % QUEUE_SIZE;  
}

二、消息队列的实现原理

消息队列是一种多个发送者和接收者之间共享数据的通信机制,允许多个任务或线程向队列发送消息,并允许多个任务或线程从队列中接收消息。消息队列通常用于处理异步事件和任务之间的通信。

1. 数据结构定义

消息队列通常由以下几个部分组成:

  • 消息队列缓冲区 :用于存储消息,可以是动态分配的数组或链表。
  • 头指针和尾指针 :分别指向队列的第一个有效消息和下一个将要插入消息的位置。
  • 消息结构 :每个消息通常包含固定大小和格式的数据,以及可能的元数据(如消息长度、优先级等)。
2. 操作原理
  • 入队操作 :将新消息添加到队列的末尾,并更新尾指针。如果队列已满,则可能需要根据队列的策略(如阻塞、丢弃旧消息等)进行处理。
  • 出队操作 :从队列的头部移除消息,并更新头指针。如果队列为空,则可能需要根据队列的策略(如阻塞、返回错误码等)进行处理。
3. 同步与并发控制

在多线程或多任务环境中,消息队列的访问需要同步控制,以防止数据竞争和不一致性。通常使用互斥锁、信号量等同步机制来保护队列的共享资源。

4. 示例场景
  • 网络通信 :在网络通信协议中,消息队列用于缓存和传输数据包。
  • 任务调度 :在操作系统嵌入式系统中,消息队列用于任务之间的通信和调度。
  • 异步处理 :在需要异步处理的应用场景中,消息队列作为缓冲和调度机制,提高系统的响应性和吞吐量。

三、嵌入式环形队列与消息队列的异同

1. 相同点
  • 数据结构基础 :两者都基于队列的数据结构,遵循先进先出(FIFO)的原则。
  • 缓存机制 :都用于在内存中缓存数据,以减少对外部存储或传输设备的依赖。
  • 应用场景 :都广泛应用于嵌入式系统、网络通信、任务调度等领域。
2. 不同点
嵌入式环形队列消息队列
存储结构固定大小的数组,通过头尾指针实现环形存储动态或静态分配的缓冲区,支持更复杂的数据结构和元数据
数据组织简单,仅存储数据本身复杂,每个消息可能包含数据、长度、优先级等元信息
队列管理侧重于队列的满空判断、循环使用空间侧重于消息的同步控制、并发访问、消息优先级等
应用场景适用于资源受限的嵌入式系统,如UARTCAN等通信协议的数据缓存适用于需要异步处理、任务调度、网络通信等复杂场景
扩展性扩展性有限,受限于固定大小的数组扩展性好,可以通过动态分配缓冲区来适应不同规模的数据传输
RTOS依赖相对独立,不直接依赖于RTOS通常与RTOS结合使用,以充分利用RTOS的同步和调度机制

综上所述,嵌入式环形队列和消息队列在实现原理和应用场景上各有特点。嵌入式环形队列以其简洁高效的存储结构和操作方式,在资源受限的嵌入式系统中得到广泛应用;而消息队列则以其强大的同步控制、并发访问和扩展性,在需要异步处理、任务调度和网络通信等复杂场景中发挥重要作用。在实际应用中,应根据具体需求和系统环境选择合适的队列实现方式。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5044

    文章

    18809

    浏览量

    298379
  • 数据结构
    +关注

    关注

    3

    文章

    568

    浏览量

    40028
  • 消息队列
    +关注

    关注

    0

    文章

    32

    浏览量

    2947
收藏 人收藏

    评论

    相关推荐

    嵌入式开发中消息队列实现

    嵌入式开发中经常会看到消息队列的身影,队列的应用是很广泛的,它可以应用的场景有很多,比如缓存通信消息,暂存执行内容,数据顺序转发等的操作。
    发表于 08-22 11:19 964次阅读
    <b class='flag-5'>嵌入式</b>开发中消息<b class='flag-5'>队列</b>的<b class='flag-5'>实现</b>

    基于STM32的串口环形队列IAP调试

    基于STM32的串口环形队列IAP调试心得
    的头像 发表于 09-18 15:33 1213次阅读
    基于STM32的串口<b class='flag-5'>环形</b><b class='flag-5'>队列</b>IAP调试

    环形队列在串口数据接收中的使用

    前言  书接上回,前文主要介绍了环形队列实现原理以及C语言实现及测试过程,本文将回归到嵌入式平台的应用中,话不多说,淦,上干货!实验目的H
    发表于 12-06 06:27

    如何使用队列实现STM32串口环形缓冲?

    串口环形缓冲的好处是什么?如何使用队列实现STM32串口环形缓冲?
    发表于 12-07 07:13

    嵌入式软件中的队列有何特点

    数据结构之队列篇1 队列之特点及在嵌入式软件中的应用队列(queue)是一个简单线性表,它是一个允许在一端进行插入操作,而在另一端进行删除操作的线性表。
    发表于 12-21 07:28

    实现队列环形缓冲的方法

    串口队列环形缓冲区队列串口环形缓冲的好处代码实现队列  要
    发表于 02-21 07:11

    环形队列的相关资料分享

    前言  当代码,不再是简单的完成需求,对代码进行堆砌,而是开始思考如何写出优美代码的时候,我们的代码水平必然会不断提升,今天,咱们来学习环形队列结构。环形队列的基本概念  相信对数据结
    发表于 02-23 06:10

    环形队列的操作如何去实现

    环形队列结构的定义是什么?环形队列的操作如何去实现呢?
    发表于 02-25 06:35

    基于环形队列的串口打印阻塞解决方法

    队列(FIFO)是一种常见的线性存储结构,在嵌入式开发中经常用到,主要的应用场景有:
    的头像 发表于 01-22 09:47 2768次阅读
    基于<b class='flag-5'>环形</b><b class='flag-5'>队列</b>的串口打印阻塞解决方法

    深度解析数据结构与算法篇之队列环形队列实现

    的位置。 02 — 环形队列实现 要想将元素放入队列我们必须知道对头和队尾,在队列长度不能无限大的条件下我们还要知道
    的头像 发表于 06-18 10:07 1768次阅读

    TencentOS-tiny中环形队列实现

    1. 什么是队列队列(queue)是一种只能在一端插入元素、在另一端删除元素的数据结构,遵循「先入先出」(FIFO)的规则。 队列中有两个基本概念: 队头指针(可变):永远指向此队列的第一个数据元素
    的头像 发表于 10-08 16:30 1302次阅读

    STM32串口环形缓冲--使用队列实现(开放源码)

    串口队列环形缓冲区队列串口环形缓冲的好处代码实现队列  要
    发表于 12-24 19:04 28次下载
    STM32串口<b class='flag-5'>环形</b>缓冲--使用<b class='flag-5'>队列</b><b class='flag-5'>实现</b>(开放源码)

    嵌入式环形队列和消息队列实现

    嵌入式环形队列和消息队列实现数据缓存和通信的常见数据结构,广泛应用于嵌入式系统中的通信协议和领
    的头像 发表于 04-14 11:52 1368次阅读

    嵌入式环形队列和消息队列是如何去实现的?

    嵌入式环形队列和消息队列实现数据缓存和通信的常见数据结构,广泛应用于嵌入式系统中的通信协议和领
    发表于 05-20 14:55 966次阅读

    裸机中环形队列与RTOS中消息队列有何区别呢?

    环形队列”和“消息队列”在嵌入式领域有应用非常广泛,相信有经验的嵌入式软件工程师对它们都不陌生。
    的头像 发表于 01-26 09:38 574次阅读
    裸机中<b class='flag-5'>环形</b><b class='flag-5'>队列</b>与RTOS中消息<b class='flag-5'>队列</b>有何区别呢?