发新帖本帖赏金 20.00元(功能说明)我要提问
返回列表
打印
[技术讨论]

什么是DMA技术

[复制链接]
2448|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sinasun|  楼主 | 2023-4-17 20:19 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
在学习单片机的过程,再开始了解到的外设操作就是串口调试。一般数据是转移有三种,内存向内存转移,内存向外设转移,外设向内存转移。在这些转移的过程,使用DMA(直接存储器存取)的方式的好处是不需要CPU的干预而直接服务外设,这样CPU就可以去干其他是事情,可以大大减轻CPU的工作量,从而可以提高系统的效率。尽管初学者使用DMA很容易写错从而导致程序通信出现莫名其妙的错误。但是写中大型工程的时候对降低一些复杂机制的实现难度是帮助,尤其是对规避临界区一类的问题是有很大帮助。现在就可以看一下DMA是如何提高系统效率。
当使用单片机串口发送一些数据,代码是这样写的:
Char a=0xAA
TXREG=a
连接上电脑后,使用串口调试助手,就能从电脑接收单片机发送的数据了。串口通讯的代码流程,第一行首先定义了一个变量a,那这个变量a到底存储到单片机的什么位置?单片机的逻辑框图,变量其实都是存储在一个交SRAM的存储器当中,这个存储速度极快。存储变量a的这个过程,是由单片机的内核CPU通过总线来操作。
上述代码的第二行程序,就是把内存SRAM中的变量a转移到串口的数据寄存器中,当串口的数据寄存器接收到数据之后,就会由串口外设自动的把数据发送出去。所以这两句代码的本质就是把数据由内存转移到外设,在发送一两个字节的数据,基本就是一两个ms的速度就能发出去。但是问题来了,如果发送一两万个字节的数据,几乎就要占用10s的时间来发送数据,此时总线上其他指令就得等待。本来在众多指令中,用的用于计算,有的用于控制程序,用的用于转移数据。而转移数据就会占用大量的CPU,就会让CPU的宝贵资源都消耗在数据转移上。所以为了解决转移数据占用CPU资源的这个痛点,所以芯片工程师开发了一种叫做DMA的模块,专门用来转移数据:内存和外设双向转移数据,在这个过程就不再需要内核的参与,就将CPU的资源完全释放出来。在DMA工作过程中,CPU不需要一直参与,只需要在内存和外设之间建立一个通道,让它们自己传射就可以了,所以DMA戏称数据世界的搬运工。空闲出来的CPU就可以控制IO口,响应中断,比如下面常规的程序:
For (i=0;i<10000;i++)
{
     TXREG=0xAA
}
Led=1;
Delay(5);
Led=0;
Delay(5);
这个程序的过程就是先发送一万个数据,然后才能以5s的闪烁周期进行LED灯的亮灭。在发送数据的过程,需要10s。在这个10s的时间内,是没有办法将LED闪烁的。如果用DMA之后,就可以同时进行发送数据和LED闪烁的功能
For (i=0;i<10000;i++)
{
     sendData=0xAA
}
DMA_PeriAddr    =0xFFF;
DMA_SramAddr   =0x000;
DMA_Direction    =DMA-Peri;
DMA_DataSize     =10000;
DMA_DataSize     =10000;
DMA_Sram+       =ON;
DMA_Peri+        =OFF;
Led_shan(10)
这个代码只需要在最开始的阶段配置好DMA的初始化程序,随后就会发送一万个串口数据。这时候发送数据就不再需要CPU参与,然后CPU就去执行LED闪烁的指令了。在这个过程,就可以形象的表示为总线上,一边发送数据一边操作IO信号翻转。
在这个过程可以理解成CPU负责和内存交互,而DMA负责了内存向低速设备的复制,至于DMA初始化代码中的含义,在单片机的Datasheet中都会有比较详细的介绍。可以直接用厂家、框架提供的函数,这种都是封装好调用DMA的代码.

使用特权

评论回复

打赏榜单

21ic小管家 打赏了 20.00 元 2023-05-26
理由:签约作者奖励

评论
cooldog123pp 2023-5-29 21:15 回复TA
很给力的教程 
发新帖 本帖赏金 20.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

63

主题

134

帖子

3

粉丝