问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

SGDMA与普通DMA:原理与应用

创作时间:
作者:
@小白创作中心

SGDMA与普通DMA:原理与应用

引用
1
来源
1.
https://www.cnblogs.com/yucloud/p/18170056/SGDMA_DMA

DMA(Direct Memory Access,直接内存访问)是一种让硬件设备能够直接读写主内存的技术,可以显著提高数据传输效率。本文将介绍两种常见的DMA实现方式:Block DMA和Scatter-Gather DMA(SGDMA),并探讨它们在不同硬件平台上的应用。

Block DMA与SGDMA的区别

Block DMA(普通DMA)每次只能传输一块物理上连续的数据,传输完成后会向CPU发出中断请求,CPU收到中断后才会安排下一次数据传输。这种方式在处理大量非连续数据时效率较低,因为需要频繁的CPU干预。

而SGDMA则通过使用链表来描述物理上不连续的存储空间。在传输过程中,DMA控制器会根据链表自动处理下一个数据块的传输,直到所有数据传输完成才向CPU发出中断请求。这种方式大大减少了CPU的干预次数,提高了数据传输效率。

Linux应用层Vectored I/O写法

在Linux系统中,Vectored I/O可以通过writev函数实现,代码示例如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/uio.h>

int main(int argc, char *argv[])
{
    const char buf1[] = "Hello, ";
    const char buf2[] = "Wikipedia ";
    const char buf3[] = "Community!\n";
    struct iovec bufs[] = {
        { .iov_base = (void *)buf1, .iov_len = strlen(buf1) },
        { .iov_base = (void *)buf2, .iov_len = strlen(buf2) },
        { .iov_base = (void *)buf3, .iov_len = strlen(buf3) },
    };
    if (writev(STDOUT_FILENO, bufs, sizeof(bufs) / sizeof(bufs[0])) == -1)
    {
        perror("writev()");
        exit(EXIT_FAILURE);
    }
    return EXIT_SUCCESS;
}

嵌入式平台上的DMA实现

STM32的DMA控制器

STM32的DMA控制器支持内存到内存、外设到内存和内存到外设等多种传输模式。其配置参数包括数据流/通道、优先级、源和目标地址、传输模式、数据量大小等。下图展示了STM32的DMA矩阵结构:

FPGA中的DMA实现

在FPGA设计中,SGDMA通过增加专门的AXI4 Scatter Gather Master接口来实现。例如,Xilinx的AXI CDMA IP支持普通DMA和SGDMA两种模式。SGDMA引擎提供了内部描述符队列,支持预读取和并行处理,可以显著减轻CPU的负担。

总结

SGDMA通过链表机制实现了对非连续数据的高效传输,相比Block DMA具有更高的数据传输效率和更低的CPU占用率。在现代嵌入式系统和高性能计算领域,SGDMA已经成为主流的DMA实现方式。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号