基于STM32Fx实现环形缓冲区搭建及运用
1.任务
(1)严格按照教师的流程,先发送 01 02 03 FF,读取,再发送04 05 FF读取。
(2)请认真阅读ringbuffer.c中的每一行代码,添加注释。结合你的Keil Simulator仿真说明你对程序代码的理解,按照教师的图示,绘制ringbuffre中指针的变化图。
(3)说明为什么环形缓冲区比普通的数组型缓冲区更加优秀?
2.完成
2.1完成老师演示流程
2.1.1导入接口函数,并添加必要的头文件
(1)接口函数:ringbuffer.c 、ringbuffer.h。
(2)添加接口函数路径到工程中。
2.1.2定义变量
图 1 定义变量
图 2 RingBuffer 数据结构
2.1.3 接口函数头文件
图 3 ringbuffer.h提供的功能函数
2.1.4 主函数部分
图 4 主函数中进行读操作
2.1.5 中断函数部分
图 5 copy数据到环形缓冲区
2.1.6 虚拟串口调试
图 6 添加变量到watch窗口
图 7 运行中,无接受到数据状态
图 8 接受数据(1)
图 9 接受数据(2)
2.1.7 程序主要流程梳理
首先规划了一个环形缓冲区,可通过RingBuffer类型变量对其进行一系列操作(计算总容量、可读、可写区域大小、写入数据、读出数据等),然后在主函数部分对环形缓冲区进行查询、读取数据(数据的搬运工1),其次在中断函数中将数据写入到环形缓冲区,以供主函数中获取数据。
2.2ringbuffer.c函数分析
2.2.1头文件和宏定义
图 10 min (a,b)
2.2.2 建立环形缓冲区
图 11 rb_new
2.2.3 获取环形缓冲区总容量大小
图 12 rb_capacity
2.2.4 可读可写区域大小计算
图 13 rb_can_read and rb_can_write
图 14 可读可写区域可视化
2.2.5 读操作
图 15 情形 1
图 16 情形 2
2.2.6 写操作
图 17 写操作流程图
2.3调试可视化
2.3.1待机状态
图 18 watch
图 19 Status 1
2.3.2发送数据
图 20 Status 2
图 21 Status 3
2.4环形缓冲区优于普通的数组型缓冲区
图 22 环形缓冲区
(1)避免了频繁的内存创建取消、分配。
(2)内存利用率提高。用更少的内存块做更多的事。
3.总结
本课时重点学习了环形缓冲区,在学习了UART DMA 数据传输的基础上,我们用环形缓存这样的内存方式来接受外界数据,我对环形缓冲区的理解是,两个人在操场跑道上散步,其中一个人是个超级富豪,一边走一边撒钱,这个人就是“头指针”,而另外一位,就比较累了,一直跟在后面捡钱,一直弯腰,所以跟不上前面人的步伐,而且他也不太想跟上,更不想超过,那样他就没钱可捡了,这个人我们称之为“尾指针”。
4.完整工程代码链接
//download.csdn.net/download/pu666/12399701