单片机模块化程序: 单片机接收数据之缓存管理,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

 

posted on 2019-10-14 12:40  广源时代  阅读(4429)  评论(1编辑  收藏  举报

导航

支付宝 QQ群