单片机学习小组
直播中

马刺牛逼

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.传递重要消息(数据)的时候



还有其他的这里就不多说了,等大家学会了以后自然能扩展更多应用。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分