使用UART DMA实现高效数据传输

DMA的概念

DMA(Direct Memory Access)即直接内存访问,DMA传输方式无需CPU直接控制传输,通过硬件为RAM、I/O设备开辟一条直接传输数据的通路,能使CPU的效率大为提高。

DMA内存访问技术

使用DMA的好处就是它不需要CPU的干预而直接服务外设,这样CPU就可以去处理别的事务,从而提高系统的效率,对于慢速设备,如UART,其作用只是降低CPU的使用率,但对于高速设备,如硬盘,它不只是降低CPU的使用率,还能提高硬件设备的吞吐量。对于这种设备,CPU直接供应数据的速度太低。 因CPU只能一个总线周期最多存取一次总线,而对于ARM,它不能把内存中A地址的值直接搬到B地址。它只能先把A地址的值搬到一个寄存器,然后再从这个寄存器搬到B地址。也就是说,对于ARM,要花费两个总线周期才能将A地址的值送到B地址。而DMA就不同了,一般系统中的DMA都有突发(Burst)传输的能力,在这种模式下,DMA能一次传输几个甚至几十个字节的数据,所以使用DMA能使设备的吞吐能力大为增强。

DMA 传输是将数据从一个地址空间复制到另外一个地址空间。当CPU 初始化这个传输动作,传输动作本身是由 DMA 控制器来实行和完成。典型的例子就是移动一个外部内存的区块到芯片内部更快的内存区。像是这样的操作并没有让处理器工作拖延,CPU反而可以去处理其他的工作。

DMA的四种传输模式:内存 —> 内存、内存 —> 外设、外设 —> 内存、外设 —> 外设

DMA与中断的区别

中断方式是在数据缓冲寄存器满之后发出中断,要求CPU进行中断处理,而DMA方式则是在所要求传送的数据块全部传送结束时要求CPU 进行中断处理。这就大大减少了CPU进行中断处理的次数。(中断次数增多导致数据丢失)
中断方式的数据传送是在中断处理时由CPU控制完成的,而DMA方式则是在DMA控制器的控制下,不经过CPU控制完成的。这就排除了 CPU因并行设备过多而来不及处理以及因速度不匹配而造成数据丢失等现象。

UART接收数据主要有以下几种方法:

  • 轮询模式
    程序循环检查是否已收到新字符并以足够快的速度读取它以获得所有字节
    优点
    容易实现,但在真正项目中的应用很少
    缺点
    在突发数据中容易错过接收到的字符
    仅适用于低波特率
    应用程序必须非常快速地检查是否收到新的数据

  • 中断模式(无DMA):
    UART触发中断,CPU跳转到中断程序处理数据接收
    优点
    目前程序中最常用的方法
    在低速率下工作良好
    缺点
    每接收到一个字符就需要去执行中断程序,浪费CPU资源

  • DMA 模式:
    DMA 用于在硬件级别将数据从 UART RX 数据寄存器传输到用户存储器。 除了在必要时由应用程序处理接收到的数据,其它时候不需要应用程序交互
    优点
    从 UART 外设到内存的传输是在硬件完成的,无需 CPU干涉
    在大量数据突发的情况下,增加数据缓冲区大小可以改进功能
    缺点
    如果通信失败,DMA 可能不会通知应用程序所有传输的字节

  • 物联沃分享整理
    物联沃-IOTWORD物联网 » 使用UART DMA实现高效数据传输

    发表评论