完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
二、队列的原理和作用
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.传递重要消息(数据)的时候 还有其他的这里就不多说了,等大家学会了以后自然能扩展更多应用。 |
|
|
|
只有小组成员才能发言,加入小组>>
3278 浏览 9 评论
2955 浏览 16 评论
3455 浏览 1 评论
8987 浏览 16 评论
4050 浏览 18 评论
1102浏览 3评论
570浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
568浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2301浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1857浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 06:04 , Processed in 1.174236 second(s), Total 78, Slave 58 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号