论武天地论坛

 找回密码
 立即注册
搜索
查看: 17000|回复: 0

05-单片机接收数据之缓存管理,DMA

[复制链接]

58

主题

58

帖子

244

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
244
发表于 2020-9-21 09:37:05 | 显示全部楼层 |阅读模式




1. 前言
在单片机通信项目中,经常会用到接收数据,然后处理.大家有没有想过什么方式才是最优的方式?
大家是否想过有没有什么标准的方案可以解决一切可能?
这节的方案是解决普通通信中接收处理问题(每次接收的数据量并不是很大,单片机的RAM够用)

2. 思考一下
前面两节学习到了判断接收到一条数据以后再去处理,还有环形队列缓存数据!
咱们可不可以把两者结合起来?
用环形队列去缓存数据,记录每次缓存的数据个数,主循环不停的去判断每次缓存的数据个数
然后取出来相应个数的数据,最后对数据做处理.
3. 方案如何实施?
既要缓存数据,又要记录每次缓存的数据个数!

我可不可以用两个环形队列?
一个环形队列负责存储接收的数据
另一个环形队列负责存储接收的数据个数

那就变为了这样子:
存储数据的时候先把数据存到一个环形队列,然后把数据个数存入另一个环形队列
取数据的时候,先到另一个环形队列里面取出来数据个数,然后根据数据个数取出来相应的数据

4. 上菜吃饭
我给大家准备好了我写的现成的.
1.包含这两个文件

819239-20200822203754952-2010060358.png



2.定义三个数组,定义缓存管理变量
一个用于缓存数据,一个用于记录每次缓存的数据个数,最后一个用于提取数据
注意:缓存数据只能u8类型(字节),记录缓存的数据个数只能是u32类型(4字节)
当时做程序的时候急用,所以就固定了,后面有时间会完善.

819239-20200822203818391-962566848.png



3.创建缓存(提醒这个地方固定乘以4)
819239-20200822203838987-639984457.png


4.插入数据
819239-20200822203851734-169565075.png


5.如果缓存里面有数据则取出来
819239-20200822203905731-609566630.png



测试
819239-20200822203930944-933559341.png


5.说明
以上程序,就是一个典型的缓存管理的通用思路
所有的数据存到缓存里面,处理数据的时候从缓存里面去取
然后取出来之后处理,然后不停的循环

6.扩展1(串口接收加入缓存管理)
串口接收加入缓存管理
1.定义用于缓存管理的数组,创建缓存
819239-20200822204018264-736898676.png


2.接收完一条数据以后存入缓存
819239-20200822204032922-2043618534.png


3.提取处理数据
819239-20200822204046889-892728445.png


测试
819239-20200822204110726-1885883043.png


7.扩展2(加入DMA)
用户需要记住一句话:
DMA的目的是减少CPU中断的进入,使得CPU可以把主要工作放到主循环处理上!

这节加上DMA以后就可以去掉串口接收中断,不用每一个字节都进去中断执行
所以这是帮助了CPU把主要工作放到主循环上!
1.去掉串口接收中断,设置DMA方式接收数据,保留空闲中断.
819239-20200822204136927-1774219254.png


2.配置DMA
819239-20200822204151352-801663425.png


3.在空闲中断获取接收的数据,重新配置DMA
819239-20200822204207672-1674863899.png



测试
819239-20200822204231460-1187725293.png


819239-20200822204238388-2118790776.png


8.说明
加入DMA以后,只不过是让DMA把接收的数据存到缓存的数组
去掉了原来的串口接收中断,不用再一个字节一个字节的进入中断

保留空闲中断的目的是判断接收完了一条完整的数据
把DMA接收的数据再次存入缓存管理,重新配置下DMA

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|论武天地论坛

GMT+8, 2024-11-21 18:19 , Processed in 0.097852 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表