SGDMA与普通DMA

news/2024/10/14 8:29:12

DMA(Direct memory access,内存直接存取),属于 Vectored I/O 方式。

区别

Scatter-gather DMA 与 Block DMA(即普通DMA) 方式不同,
Block DMA: 一次只传输一块物理上连续的数据,完成后中断,主机收到中断后再行下一块物理上连续的数据传输。
Scatter-gather DMA: 使用一个链表描述物理上不连续的存储空间,然后把链表首地址告诉DMA master。DMA master在传输完一块物理连续的数据后,会直接根据链表继续传输下一块物理上连续的数据,直到传输完毕后才发起中断。

很显然,scatter-gather DMA方式比block DMA方式效率高,但需要硬件实现,软件对接。

下图是某IP厂商的SG-DMA IP
image

Linux应用层 Vectored_I/O 写法(需驱动实现)

应用层的写法,代码来自Vectored_I/O-wikipedia:

#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;
}

STM32 的 DMA控制器(Block DMA)

RM0090-STM32F4

支持 内存到内存,外设到内存,内存到外设 四种。

框图
image

STM32上的DMA矩阵。
image

内存到外设模式的内部工作图
image

需要配置的参数有:

  • DMA 数据流 / 通道
  • 数据流优先级
  • 源和目标地址
  • 传输模式
  • 传输数据量大小 (仅当 DMA 为流量控制器时)
  • 源 / 目标地址递增或非增
  • 源和目标数据宽度
  • 传输类型
  • FIFO 模式
  • 源 / 目标批量传输数据量大小
  • 双缓冲区模式
  • 流控

AN4031 手册有更多的说明。

Block DMA 描述符

Block DMA 支持传输物理地址连续的内存,只需要告诉DMA控制器三元参数描述符(数据长度,源地址,目的地址)
image

FPGA

FPGA IP 设计和造芯片有一些相同的步骤。我们拿拥有居多开源资源的FPGA资料来看再好不过了。

Xilinx IP 之 AXI CDMA

https://docs.amd.com/r/en-US/pg034-axi-cdma/Overview
image

像赛灵思的IP,控制器支持普通DMA和SGDMA两种,可以非常清晰地看到,SGDMA不同于普通DMA的接口。

该IP对于SGDMA的描述:

The AXI CDMA can optionally include Scatter/Gather (SG) functionality for off-loading CPU management tasks to hardware automation. The Scatter/Gather Engine fetches and updates CDMA control transfer descriptors from system memory through the dedicated AXI4 Scatter Gather Master interface. The SG engine provides internal descriptor queuing, which allows descriptor prefetch and processing in parallel with ongoing CDMA data transfer operations.

可以看到关键字样是off-loading卸载CPU的运算压力。SGDMA引擎提供了内部描述符队列。支持预读取和并行处理。

像在赛灵思的FPGA设计中,SGDMA会比普通DMA多了一个M_AXI_SG总线,用于读取SGDMA的描述符。

Intel IP 之 SG-DMA Controller Core

image

SG-DMA 描述符

我们可以看一下世界两大FPGA巨头的描述符
赛灵思FPGA的寄存器
image

英特尔旗下FPGA的寄存器
https://www.intel.com/content/www/us/en/docs/programmable/683130/24-1/dma-descriptors-06781.html
image

需要DMA控制器四元参数描述符(大小,源地址,目的地址,下一链的地址)

如果您需要设计FPGA程序,可以参考这篇:https://www.cnblogs.com/ruidongwu/p/15046127.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/26786.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

一些不错的语文题

金考卷绿色模拟 散文 1.《蝉自故乡来》与鲁迅《故乡》中“我”的思想变化截然相反 故乡中的我在童年时对故乡的人和事都是热爱的,没有渴望远离的想法,(如少年闰土),而成年后回到故乡感到物是人非,才想要逃离故乡(闰土后来的样子可知晓,以及祥林嫂等类似的素材)首先这个…

.Net 8.0 下的新RPC,IceRPC之请求生命线意义非凡

作者引言很高兴啊,我们来到了IceRPC之"请求"生命线意义非凡,号称“死亡时间”的追命线,颤抖吧!"请求"生命线之意义非凡本文将深入探讨将截止时间纳入RPCs的重要性, 以开发更强大的分布式应用程序。概述 RPC(远程过程调用)系统中发送请求,通常会带来…

.NET CORE 完美支持AOT 的 ORM SqlSugar 教程

1、AOT适合产场 Aot适合工具类型的项目使用,优点禁止反编 ,第一次启动快,业务型项目或者反射多的项目不适合用AOT AOT更新记录: 实实在在经过实践的AOT ORM 5.1.4.117 +支持AOT 5.1.4.123 +支持CodeFirst和异步方法 5.1.4.129-preview12+ 修复 db.Unionall bug 5.1.4.129-p…

php合并时间区间

需要写一段合并时间区间的代码,写个demo记录下 <?php $arr = [["2024-04-16 11:25:46", "2024-04-16 12:19:21"],["2024-04-16 03:14:06", "2024-04-16 10:13:21"],["2024-04-16 13:14:59", "2024-04-16 15:44:46…

王道数据结构个人向笔记-第二章(线性表)

目录2.1 线性表的定义和基本操作2.2 顺序表2.2.1 顺序表的定义2.2.2 顺序表的插入、删除(实现是基于静态分配)2.2.3 顺序表的查找2.3 链表2.3.1 单链表的定义2.3.2 单链表的插入删除2.3.3 单链表的查找2.3.4 单链表的建立2.3.4 双链表2.3.5 循环链表2.1 线性表的定义和基本操…

Java安全基础之Java反射机制和ClassLoader类加载机制

反射机制允许程序在运行时检查和操作类、对象、方法以及属性的信息。类加载机制负责将类的字节码加载到内存中,并且在运行时动态地链接和初始化类。目录Java 反射机制反射 java.lang.RuntimeClassLoader 类加载机制URLClassLoaderloadClass() 与 Class.forName() 的区别? Jav…

高中生一定就会了么???(i)

\(题源:2023星光杯数学思维能力测评(小学组)第一试\)\(表示离谱\)