dma适用于什么数据传送_为什么需要DMA?你知道吗?

DMA(Direct memory access直接存储器读写)是单片机初学者比较困惑的问题,好像没用到过,系统也照样跑的好好的~~。

今天这部分内容主要为后面基于DMA的数据传输做个技术铺垫。

1.DMA是干什么用的

在没有DMA的情况下,要实现读写如串口,SPI等外设时,CPU要被占用,而无法处理其它任务。比如前一篇基于中断的串口通信例程中(https://www.toutiao.com/i6723425636653728263/),CPU要响应串口和时钟中断,在整个中断程序内,CPU都是被中断占用的,此外,响应中断时还要实现现场数据的压栈(就是把中断时主程序的运行状态寄存器值存储到内存的栈中,关于栈--参看前面的文章),中断结束时还要恢复现场数据(就是把内存栈中的状态数据又恢复到状态寄存器中,以继续运行被中断的主程序),这些都大大降低了CPU运行主程序的效率。

那么,能不能不让CPU去响应外设中断而实现外设数据的收发呢?答案是可以滴,DMA就是帮你干这个事的。让CPU专心处理数据,这些慢速外设数据的读写,交给DMA来做,等DMA把数据收发完成了,通知CPU一声,完美~~。

975a48743a9d111ff24be8b50fe51339.png

DMA控制示意图

DMA控制流程

(1)CPU首先要初始化DMA。就是告诉DMA要做什么,比如要传送的数据是什么类型啊,从哪到哪啊,传送几次啊,数据传输时把DMA的哪些状态通知CPU啊,以什么方式通知啊,就这些东东,简单吧~~;

(2)然后使能DMA,DMA就按照CPU的初始化参数开始干活了。整个干活的过程是不需要CPU介入,默默无闻一直把活干完(中间也可能汇报一次,把初始化要求)。

(3)DMA完成传送的次数以后,通知CPU,我把活干完了,剩下就是你的事了。

从这个图可以看到,DMA和CPU是共用总线的,如果二个人同时需要使用总线怎么办呢,可能会让CPU等一下,但是这种对CPU的影响是非常小的。

2.DMA什么时候用

DMA这么好,是不是非要用呢?也不是。其实很多小程序都没有使用也没必要使用DMA,毕竟在程序中增加一个功能,也是需要时间成本的。笔者就写过好多小程序,大都使用中断就解决问题了,原因就是简单,上手快才是王道,老板才不管你是怎么干的,只要能实现目标就行。

那什么时候用DMA呢?笔者认为,当慢速外设通信比较多,数据量比较大的时候,如果使用中断会明显影响系统性能的时候,要用。当有大量高速AD转换的时候,要用。其实现在网络和USB接口,好多都自带DMA了。

3.DMA怎么用

这个事,还是让代码说话吧~~,一个例子胜过千言万语,明后天给大家讲基于DMA的串口通信。

码字很辛苦,大家的支持是我最大的动力,谢谢关注。

补充一点,响应中断时的压栈和结束中断时的出栈过程,在目前的单片机编程中,不需要程序员任何额外代码,编译器会自动完成的,咱们知道有这个过程就行了。而且为了缩短这个过程对CPU的影响,处理器厂家都做了很多工作。

fb76e04aaf085768ab95b1e4e5348ac7.png

DMA控制信号示意图

ea91ed79a1cc57128cdfdf892a380772.png

DMA总线示意图

  • 11
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值