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

    文章

    6511

    浏览量

    87596
  • 函数
    +关注

    关注

    3

    文章

    3868

    浏览量

    61308
  • 队列
    +关注

    关注

    1

    文章

    46

    浏览量

    10849
收藏 人收藏

    评论

    相关推荐

    用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 7849次阅读

    详细了解卡尔曼滤波器

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

    深入浅出了解单调栈和单调队列

    袁厨携袁记菜馆全体工作人员祝大家在新的一年,健健康康,开开心心。发量暴增,钱包超大。 哎,元旦假期结束了,又要继续搬砖了,我们接着做题吧,今天我们好好说说单调栈和单调队列。其实很容易理解,单调栈就是
    的头像 发表于 02-02 10:18 1247次阅读
    深入浅出<b class='flag-5'>了解</b>单调栈和单调<b class='flag-5'>队列</b>

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

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

    详细了解岩土工程安全监测的振弦采集仪

    详细了解岩土工程安全监测的振弦采集仪 岩土工程安全监测是工程建设过程中非常重要的一环,它可以及时发现和解决岩土工程中的问题,确保工程的安全和稳定。而振弦采集仪作为现代化的监测设备,被广泛应用于岩土
    的头像 发表于 07-11 11:23 286次阅读
    <b class='flag-5'>详细了解</b>岩土工程安全监测的振弦采集仪

    什么是 “星闪”?星闪技术架构和特点分析

    我们详细了解一下星闪的技术架构和特点。 前面我们提到,星闪是增强版的“Wi-Fi+蓝牙”。为了实现这两种不同的特性,星闪采用了特殊的架构设计。
    发表于 10-23 18:14 4912次阅读
    什么是 “星闪”?星闪技术架构和<b class='flag-5'>特点</b>分析

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

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