单片机模块化程序: 单片机接收数据之缓存管理,DMA
1. 前言
在单片机通信项目中,经常会用到接收数据,然后处理.大家有没有想过什么方式才是最优的方式?
大家是否想过有没有什么标准的方案可以解决一切可能?
这节的方案是解决普通通信中接收处理问题(每次接收的数据量并不是很大,单片机的RAM够用)
2. 思考一下
前面两节学习到了判断接收到一条数据以后再去处理,还有环形队列缓存数据!
咱们可不可以把两者结合起来?
用环形队列去缓存数据,记录每次缓存的数据个数,主循环不停的去判断每次缓存的数据个数
然后取出来相应个数的数据,最后对数据做处理.
3. 方案如何实施?
既要缓存数据,又要记录每次缓存的数据个数!
我可不可以用两个环形队列?
一个环形队列负责存储接收的数据
另一个环形队列负责存储接收的数据个数
那就变为了这样子:
存储数据的时候先把数据存到一个环形队列,然后把数据个数存入另一个环形队列
取数据的时候,先到另一个环形队列里面取出来数据个数,然后根据数据个数取出来相应的数据
4. 上菜吃饭
我给大家准备好了我写的现成的.
1.包含这两个文件
2.定义三个数组,定义缓存管理变量
一个用于缓存数据,一个用于记录每次缓存的数据个数,最后一个用于提取数据
注意:缓存数据只能u8类型(字节),记录缓存的数据个数只能是u32类型(4字节)
当时做程序的时候急用,所以就固定了,后面有时间会完善.
3.创建缓存(提醒这个地方固定乘以4)
4.插入数据
5.如果缓存里面有数据则取出来
测试
5.说明
以上程序,就是一个典型的缓存管理的通用思路
所有的数据存到缓存里面,处理数据的时候从缓存里面去取
然后取出来之后处理,然后不停的循环
6.扩展1(串口接收加入缓存管理)
串口接收加入缓存管理
1.定义用于缓存管理的数组,创建缓存
2.接收完一条数据以后存入缓存
3.提取处理数据
测试
7.扩展2(加入DMA)
用户需要记住一句话:
DMA的目的是减少CPU中断的进入,使得CPU可以把主要工作放到主循环处理上!
这节加上DMA以后就可以去掉串口接收中断,不用每一个字节都进去中断执行
所以这是帮助了CPU把主要工作放到主循环上!
1.去掉串口接收中断,设置DMA方式接收数据,保留空闲中断.
2.配置DMA
3.在空闲中断获取接收的数据,重新配置DMA
测试
8.说明
加入DMA以后,只不过是让DMA把接收的数据存到缓存的数组
去掉了原来的串口接收中断,不用再一个字节一个字节的进入中断
保留空闲中断的目的是判断接收完了一条完整的数据
把DMA接收的数据再次存入缓存管理,重新配置下DMA