单片机学习小组
登录
直播中
马刺牛逼
12年用户
533经验值
擅长:模拟技术
私信
关注
如何去实现一种队列程序的设计呢
开启该帖子的消息推送
单片机
嵌入式
队列
队列的原理是什么?
队列有何
作用?
如何去实现一种
队列程序的设计呢?
回帖
(1)
王桂珍
2022-2-25 14:57:41
二、队列的原理和作用
1.队列原理
队列原理其实就像一个管道,如果我们不断往管道里面塞乒乓球,每个乒乓球在管道里就会排成一条队形。
先进去的乒乓球就会先出来,这个就是队列里先进先出的规则。我们看下这个图
球从左边进去,进去的动作叫
入列。
然后进去的球在管道里排成一个
队列
,这个叫
队列缓存
,说白了就是
数组
,那么这里存了5个球就相当于是buff[5]。
最右边出来的1号球是最早进去的球,这个出来的动作叫
出列
,所以遵循
了
先进先出
的规则。
2.队列作用
队列最主要的作用啊是用来
管理数据流的,防止数据因为传输频率过快得不到及时处理而丢失
。
比方说串口接收数据,我们一般定义一个
数组来存储数据
,但是数组存储程序写起来没那么方便,需要有一些变量来记录数组当前可存储的下标,移植性各方面性能都比较差。
假如串口数据频率很快,可能这个数组里存储的数据还没处理完,下一组串口数据又过来了,那么这时候数组里的数据就会被新数据覆盖,导致老的数据丢失。
这就是实际产品开发当中会经常碰到的一些痛点。
所以需要一种技术或者算法去解决这个问题,把实现能解决这些痛点的代码更好地封装起来,同时保证很好的移植性和可扩展性、还有灵活性。
这个时候队列算法就派上用场了。
像这种就可以通过队列的方式来处理,每收到一个字节数据都先入列,然后在应用程序同步解析处理,根据队列先进先出的规则,那么老的数据就不会被新的数据“插队”了。
这里只是说出了队列的其中一个应用,实际上队列的作用还有非常多,比如可以用来传递信号,参数等等。
更多的实用性应用可以跟无际单片机编程从实际产品中去学习。
三、队列程序设计思路
其实实现队列的方法有很多种,不同的工程师实现的代码不一样。
但是原理都是一样的,我们要编写代码,首先要很清楚队列的工作原理,这个我们上面已经讲了,那么我们这里来总结队列的
3个核心关键点
:
1.队列缓存
2.入列
3.出列
一个队列是不是基本需要这3个必要的操作?
1.队列缓存
那么
队列缓存
很好理解,说白了就是直接定义一个数组,数组大小就是队列缓存的大小。
数组越大,队列缓存就越大,能存储的数据就越多,数据传输也越稳定。
入列
就是把1个或若干个数据按顺序存到队列缓存数组里,同样
出列
把数据从队列缓存里取出来。
入列和出列的原理懂了,那么我们接下来就要思考一个大家最关心的问题:入列和出列怎么用程序来实现呢?
2.入列
根据我们前面的理论,入列其实就是把数据存进数组的操作,我们平时存数组一般都是buff[0]=1;这样操作。
那么入列其实没那么简单,因为要考虑队列缓存里面当前存了多少个数据的情况。
如果有数据,那么我们就不能从[0]这个下标开始入列,所以我们在入列时要考虑2个问题:
.①队列缓存可以存储的数组下标位置,这个我们一般称为
队尾。
②队列是否已满,如果队列缓存满了又有新的数据入列,该怎么处理?这里我们一般处理方式是按照时间顺序,把最早入列的数据丢弃,以新的数据替换。
那么第2个问题呢我们暂时先不管,我们来看下第1个问题。
我们前面的文章学过数组与指针,通过指针的特性,我们在用1个指针变量来代表
队尾指针
,初始化的时候这个队尾指针指向队列缓存数组的首地址。
当入列1个数据时,我的队尾指针就加1,这样是不是就能够知道当前队列缓存的存储可位置地址了?
2.出列
数据入列以后自然要取出来,那么我们取的时候呢也是有原则的,不能乱取,而是从最早入列那个数据的地址开始取。
所以这个出列的数组下标我们称为
队头指针
,同样的我们可以使用指针变量来代表队头。
上图是一个出列的流程,我们这个是满编队的队列。
总共有1,2,3,4,5个数据,那么队头指针指向队列缓存首地址,接着第一个出列的就是数据1。
出列后对头指针加1,就指向了数据2的地址,那么数据2出列后,对头指针又加1,指向数据3的地址,以此类推,这样就能实现先进先出的原则。
三、队列算法代码编写
1.定义队列对象
大家发现了没,不管是入列、还是出列,这些操作都是基于队列这个对象来操作的。
所以,我们先要把队列当做一个对象给定义出来:
通过结构体来封装一个对象再合适不过了。
一个队列的结构体包含3个东西:
队头指针、队尾指针、队列缓存
。
当然,这个队列缓存还可以根据你的实际产品应用定义不同的大小。
2.入列算法
入列算法根据前面的理论部分编写,代码经过了批量产品的验证。
这里就不详细解释了,有配套的视频讲解的更详细,要的可以找无际单片机编程获取。
入列和出列之前必须注意要进入临界和退出临界。
进入临界的意思就是把单片机的总中断关闭,退出临界就是恢复进入临界之前的中断状态。
3.出列算法
大家如果仔细看,不管是入列还是出列,都是对结构体的成员进行操作。
所以,c语言玩到后面真的也就是面向对象的编程思维。
那出列对应的讲解我们也有配套视频,这里就不再重复了,免得大家看得头疼。
4.其他注意
在使用队列前,一定要把队头指针和队尾指针指向队列缓存第一个元素的地址,否则会引起程序崩溃。
四、掌握队列在产品中的应用
1.我现在做串口数据流接收基本都会用
2.传递重要消息(数据)的时候
还有其他的这里就不多说了,等大家学会了以后自然能扩展更多应用。
二、队列的原理和作用
1.队列原理
队列原理其实就像一个管道,如果我们不断往管道里面塞乒乓球,每个乒乓球在管道里就会排成一条队形。
先进去的乒乓球就会先出来,这个就是队列里先进先出的规则。我们看下这个图
球从左边进去,进去的动作叫
入列。
然后进去的球在管道里排成一个
队列
,这个叫
队列缓存
,说白了就是
数组
,那么这里存了5个球就相当于是buff[5]。
最右边出来的1号球是最早进去的球,这个出来的动作叫
出列
,所以遵循
了
先进先出
的规则。
2.队列作用
队列最主要的作用啊是用来
管理数据流的,防止数据因为传输频率过快得不到及时处理而丢失
。
比方说串口接收数据,我们一般定义一个
数组来存储数据
,但是数组存储程序写起来没那么方便,需要有一些变量来记录数组当前可存储的下标,移植性各方面性能都比较差。
假如串口数据频率很快,可能这个数组里存储的数据还没处理完,下一组串口数据又过来了,那么这时候数组里的数据就会被新数据覆盖,导致老的数据丢失。
这就是实际产品开发当中会经常碰到的一些痛点。
所以需要一种技术或者算法去解决这个问题,把实现能解决这些痛点的代码更好地封装起来,同时保证很好的移植性和可扩展性、还有灵活性。
这个时候队列算法就派上用场了。
像这种就可以通过队列的方式来处理,每收到一个字节数据都先入列,然后在应用程序同步解析处理,根据队列先进先出的规则,那么老的数据就不会被新的数据“插队”了。
这里只是说出了队列的其中一个应用,实际上队列的作用还有非常多,比如可以用来传递信号,参数等等。
更多的实用性应用可以跟无际单片机编程从实际产品中去学习。
三、队列程序设计思路
其实实现队列的方法有很多种,不同的工程师实现的代码不一样。
但是原理都是一样的,我们要编写代码,首先要很清楚队列的工作原理,这个我们上面已经讲了,那么我们这里来总结队列的
3个核心关键点
:
1.队列缓存
2.入列
3.出列
一个队列是不是基本需要这3个必要的操作?
1.队列缓存
那么
队列缓存
很好理解,说白了就是直接定义一个数组,数组大小就是队列缓存的大小。
数组越大,队列缓存就越大,能存储的数据就越多,数据传输也越稳定。
入列
就是把1个或若干个数据按顺序存到队列缓存数组里,同样
出列
把数据从队列缓存里取出来。
入列和出列的原理懂了,那么我们接下来就要思考一个大家最关心的问题:入列和出列怎么用程序来实现呢?
2.入列
根据我们前面的理论,入列其实就是把数据存进数组的操作,我们平时存数组一般都是buff[0]=1;这样操作。
那么入列其实没那么简单,因为要考虑队列缓存里面当前存了多少个数据的情况。
如果有数据,那么我们就不能从[0]这个下标开始入列,所以我们在入列时要考虑2个问题:
.①队列缓存可以存储的数组下标位置,这个我们一般称为
队尾。
②队列是否已满,如果队列缓存满了又有新的数据入列,该怎么处理?这里我们一般处理方式是按照时间顺序,把最早入列的数据丢弃,以新的数据替换。
那么第2个问题呢我们暂时先不管,我们来看下第1个问题。
我们前面的文章学过数组与指针,通过指针的特性,我们在用1个指针变量来代表
队尾指针
,初始化的时候这个队尾指针指向队列缓存数组的首地址。
当入列1个数据时,我的队尾指针就加1,这样是不是就能够知道当前队列缓存的存储可位置地址了?
2.出列
数据入列以后自然要取出来,那么我们取的时候呢也是有原则的,不能乱取,而是从最早入列那个数据的地址开始取。
所以这个出列的数组下标我们称为
队头指针
,同样的我们可以使用指针变量来代表队头。
上图是一个出列的流程,我们这个是满编队的队列。
总共有1,2,3,4,5个数据,那么队头指针指向队列缓存首地址,接着第一个出列的就是数据1。
出列后对头指针加1,就指向了数据2的地址,那么数据2出列后,对头指针又加1,指向数据3的地址,以此类推,这样就能实现先进先出的原则。
三、队列算法代码编写
1.定义队列对象
大家发现了没,不管是入列、还是出列,这些操作都是基于队列这个对象来操作的。
所以,我们先要把队列当做一个对象给定义出来:
通过结构体来封装一个对象再合适不过了。
一个队列的结构体包含3个东西:
队头指针、队尾指针、队列缓存
。
当然,这个队列缓存还可以根据你的实际产品应用定义不同的大小。
2.入列算法
入列算法根据前面的理论部分编写,代码经过了批量产品的验证。
这里就不详细解释了,有配套的视频讲解的更详细,要的可以找无际单片机编程获取。
入列和出列之前必须注意要进入临界和退出临界。
进入临界的意思就是把单片机的总中断关闭,退出临界就是恢复进入临界之前的中断状态。
3.出列算法
大家如果仔细看,不管是入列还是出列,都是对结构体的成员进行操作。
所以,c语言玩到后面真的也就是面向对象的编程思维。
那出列对应的讲解我们也有配套视频,这里就不再重复了,免得大家看得头疼。
4.其他注意
在使用队列前,一定要把队头指针和队尾指针指向队列缓存第一个元素的地址,否则会引起程序崩溃。
四、掌握队列在产品中的应用
1.我现在做串口数据流接收基本都会用
2.传递重要消息(数据)的时候
还有其他的这里就不多说了,等大家学会了以后自然能扩展更多应用。
举报
更多回帖
rotate(-90deg);
回复
相关问答
单片机
嵌入式
队列
怎样
去
设计
一种
采用覆盖机制的FIFO
队列
模型
呢
2021-12-08
691
如何
去
实现
一种
基于LCD滚动显示汉字的设计
呢
2022-01-24
654
怎样
去
实现
一种
USART串口通信
程序
呢
2022-02-18
687
环形
队列
的操作如何
去
实现
呢
2022-02-25
661
如何
去
实现
一种
简易加湿器的PCB设计
呢
2022-03-01
1748
如何
去
实现
一种
STM32标准库函数
呢
2021-11-25
698
请问
一
下如何
去
实现
一种
基于STM32的MLX90614测温显示设计
呢
2021-12-15
715
请问
一
下如何
去
实现
一种
42步进电机的
程序
呢
2021-12-20
1823
如何
去
实现
一种
遥控和触摸并存的开关设计
呢
2021-11-05
1667
FreeRtos中消息
队列
API的调用该怎样
去
实现
呢
2022-01-20
1112
发帖
登录/注册
20万+
工程师都在用,
免费
PCB检查工具
无需安装、支持浏览器和手机在线查看、实时共享
查看
点击登录
登录更多精彩功能!
首页
论坛版块
小组
免费开发板试用
ebook
直播
搜索
登录
×
20
完善资料,
赚取积分