SGDMA與普通DMA

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章