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

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

3天内不再提示

详细了解队列的特点及用处

嵌入式应用开发 来源:嵌入式应用开发 作者:嵌入式应用开发 2022-05-31 15:25 次阅读

队列的特点:

先进先出,队列是一种操作受限的线性表,其限制条件为允许在表的一端进行插入,而在表的另一端进行删除。插入的一端叫做队尾,删除的一端叫做队头。向队列中插入新元素的行为称为进队,从队列中删除元素的行为称为出队。一般用法在队头插入,在队尾删除。

队列终究它就是个buf,buf就是存东西的,保存不丢失,可以理解为在buf上封装了一些操作。

队列的用处:

1、用于任务间通信,尤其对于单任务系统,多个任务都操作一个队列,比如,A任务往队列里扔数据,B任务负责检查队列,只要有数据就进行处理,起到了两个任务通信的效果,同样可以把这个数据理解为消息,A任务给B任务发消息,B任务根据不同的消息(数据)做不同的处理。

2、缓冲数据。最常见的就是串口接收数据,搞一个环形buf队列,收到数据就放到这个队列中,当然这个buf肯定是有长度的,不能一直存储数据。正常用法下,得及时读取走,这样就能一直接收数据不丢失。

队列的几个基本的使用包括:

  1. 队列的创建;
  2. 队列的添加元素,删除元素,提取元素等对队列的操作;

队列的创建:首先定义一个队列的大小,这里直接定义为int型数组,最大存储6个元素。定义一个结构体存放队列的信息,包括数组的指针,用于后续对数组的操作,定义好结构体后对结构体进行初始化

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;}

队列空间 与队列数据数量的函数如下:

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;}

如果要对队列增加和删除元素要进行队列的相关操作。定义函数如下:

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;}

队列生成后要进行队列的元素判断,队列是否为空,或者是否队列已满,定义函数如下:

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;}

下面就对队列 的数据进行相关的操作,包括增加数据入队列,数据出队列等相关的操做,运行函数观察运行起来的状态。

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);}

运行结果如下图所示:

poYBAGKUgcmAfgcpAABhQIfmPK0474.png运行结果

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

    关注

    8

    文章

    7026

    浏览量

    89026
  • 函数
    +关注

    关注

    3

    文章

    4331

    浏览量

    62610
  • 队列
    +关注

    关注

    1

    文章

    46

    浏览量

    10893
收藏 人收藏

    评论

    相关推荐

    Labview Queue State Machine(队列状态机)

    本帖最后由 eehome 于 2013-1-5 10:02 编辑 下面是一个Sample,想要详细了解,请回帖,我们一起学习……
    发表于 07-06 16:16

    用VDK+BF537开发产品中,想详细了解一下VDK中事件、事件bit、信号量的使用方法,以及如何写自己的device drivers

    用VDK+BF537开发产品中,想详细了解一下VDK中事件、事件bit、信号量的使用方法,以及如何写自己的device drivers。请问哪有针对上述问题的资料下载?
    发表于 12-06 09:19

    请大神通俗易懂的描述一下队列以及状态机用处和用法

    一直没太搞明白队列用处和用法,请问是控制流程使用的吗?我有一个设备需要进行1,2,3,4,5个步骤需要执行,但是执行哪几个有我选定,这个时候就可以用队列,状态机是吧?具体怎么用有人能介绍一下吗???
    发表于 12-24 13:42

    关于蓝牙模块基础知识点介绍的太详细了

    关于蓝牙模块基础知识点介绍的太详细了
    发表于 10-08 06:56

    详细了解下ups的相关计算

    关于ups方面的计算有很多,ups无论是接空开,还是连接电缆,以及选择电池,都可能需要计算它的电流或功率等,那么今天我们来详细了解下ups的相关计算。一、UPS电源及电流一、高频ups与工频ups
    发表于 11-16 09:08

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

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

    详细了解一下STM32F1的具体电路参数

    最近笔者在使用STM32时,需要详细了解一下F1的具体电路参数。于是查看其官方数据手册,结果记录如下。绝对最大额度值一般工作条件表中的FT指5V 耐压。可以在引脚定义表格中看到。I/O端口特性(逻辑电平)在最后一个表格中还可以看到STMF103芯片内部的上/下拉电阻的阻值为40k。...
    发表于 01-18 07:07

    通过 iftop、 nethogs 和 vnstat 详细了解你的网络连接状态

    通过 iftop、 nethogs 和 vnstat 详细了解你的网络连接状态。
    的头像 发表于 01-27 21:10 2.1w次阅读
    通过 iftop、 nethogs 和 vnstat <b class='flag-5'>详细了解</b>你的网络连接状态

    TI官网的中文详细概述带你了解TI官网用处

    本文的主要内容介绍的是TI的官网中文详细概述带你了解TI官网用处
    发表于 04-23 15:39 43次下载
    TI官网的中文<b class='flag-5'>详细</b>概述带你<b class='flag-5'>了解</b>TI官网<b class='flag-5'>用处</b>

    什么是优先队列?漫画形式带你详细了解优先队列

    这一次,我们来讲一讲二叉堆的另外一个应用:优先队列
    的头像 发表于 10-03 20:10 8074次阅读

    详细了解卡尔曼滤波器

    在这篇文章的结尾,您将对KF的工作原理,其背后的想法,为什么需要多个变体以及最常见的变体有一个直观而详细了解
    的头像 发表于 05-03 18:31 2887次阅读
    <b class='flag-5'>详细了解</b>卡尔曼滤波器

    一文详细了解OpenHarmony新图形框架

    3月30日,OpenHarmony v3.1 Release版本正式发布了。此版本为大家带来了全新的图形框架,实现了UI框架显示、多窗口、流畅动画等基础能力,夯实了OpenHarmony系统能力基座。下面就带大家详细了解新图形框架。
    的头像 发表于 04-27 13:21 2221次阅读
    一文<b class='flag-5'>详细了解</b>OpenHarmony新图形框架

    带您一起详细了解IEEE802.3bt(PoE++)的有关特点

    Hqst华强盛(盈盛电子)导读:带您一起详细了解IEEE802.3bt(PoE++)的有关特点,让我们对IEEE802.3bt(PoE++)协议有更具体的了解
    的头像 发表于 01-04 11:26 2187次阅读
    带您一起<b class='flag-5'>详细了解</b>IEEE802.3bt(PoE++)的有关<b class='flag-5'>特点</b>

    一文带你详细了解工业电脑

    扇设计、承受振动和恶劣环境的能力、轻松配置、全面的I/O选项、延长生命周期、耐用的组件。了解如何为您的应用选择工业电脑对提高设施的生产力和效率至关重要。详细了解
    的头像 发表于 06-12 14:24 408次阅读
    一文带你<b class='flag-5'>详细了解</b>工业电脑

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

    嵌入式环形队列,也称为环形缓冲区或循环队列,是一种先进先出(FIFO)的数据结构,用于在固定大小的存储区域中高效地存储和访问数据。其主要特点包括固定大小的数组和两个指针(头指针和尾指针),分别指向
    的头像 发表于 09-02 15:29 517次阅读