Zynq 中DMA测速
时间: 2024-02-24 20:54:31 浏览: 158
zynq 嵌入式Linux下的DMA测试(PS+PL)
在Zynq中,可以使用AXI DMA模块来进行数据传输,同时也可以使用Xilinx提供的DMA IP核。以下是一个基本的DMA测速代码示例:
```c
#include <stdio.h>
#include "xaxidma.h"
#include "xil_printf.h"
#include "xparameters.h"
#define DMA_DEV_ID XPAR_AXIDMA_0_DEVICE_ID
#define BUFFER_SIZE 1024
int main()
{
XAxiDma AxiDma;
XAxiDma_Config *CfgPtr;
int Status;
int i;
int *TxBufferPtr;
int *RxBufferPtr;
int Value;
int Error = 0;
int TestLength = BUFFER_SIZE * sizeof(int);
TxBufferPtr = (int *)malloc(BUFFER_SIZE * sizeof(int));
RxBufferPtr = (int *)malloc(BUFFER_SIZE * sizeof(int));
for (i = 0; i < BUFFER_SIZE; i++) {
TxBufferPtr[i] = i;
}
CfgPtr = XAxiDma_LookupConfig(DMA_DEV_ID);
if (!CfgPtr) {
xil_printf("No config found for %d\r\n", DMA_DEV_ID);
return XST_FAILURE;
}
Status = XAxiDma_CfgInitialize(&AxiDma, CfgPtr);
if (Status != XST_SUCCESS) {
xil_printf("Initialization failed %d\r\n", Status);
return XST_FAILURE;
}
if(!XAxiDma_HasSg(&AxiDma)) {
xil_printf("Device configured as simple mode \r\n");
return XST_FAILURE;
}
Status = XAxiDma_Selftest(&AxiDma);
if (Status != XST_SUCCESS) {
xil_printf("Self test failed %d\r\n", Status);
return XST_FAILURE;
}
XAxiDma_Reset(&AxiDma);
while (XAxiDma_ResetIsDone(&AxiDma) != 1);
XAxiDma_IntrDisable(&AxiDma, XAXIDMA_IRQ_ALL_MASK, XAXIDMA_DEVICE_TO_DMA);
XAxiDma_IntrDisable(&AxiDma, XAXIDMA_IRQ_ALL_MASK, XAXIDMA_DMA_TO_DEVICE);
Status = XAxiDma_SimpleTransfer(&AxiDma, (u32)RxBufferPtr, TestLength, XAXIDMA_DEVICE_TO_DMA);
if (Status != XST_SUCCESS) {
xil_printf("RX transfer failed %d\r\n", Status);
return XST_FAILURE;
}
Status = XAxiDma_SimpleTransfer(&AxiDma, (u32)TxBufferPtr, TestLength, XAXIDMA_DMA_TO_DEVICE);
if (Status != XST_SUCCESS) {
xil_printf("TX transfer failed %d\r\n", Status);
return XST_FAILURE;
}
while (XAxiDma_Busy(&AxiDma, XAXIDMA_DEVICE_TO_DMA));
for (i = 0; i < BUFFER_SIZE; i++) {
Value = RxBufferPtr[i];
if (Value != i) {
xil_printf("Data error %d: %d/%d\r\n", i, Value, i);
Error ++;
}
}
if (Error) {
xil_printf("Test failed %d/%d\r\n", Error, BUFFER_SIZE);
return XST_FAILURE;
} else {
xil_printf("Test passed %d/%d\r\n", BUFFER_SIZE - Error, BUFFER_SIZE);
return XST_SUCCESS;
}
}
```
在上述示例中,我们使用了AXI DMA模块,首先进行了初始化和自测。然后,我们将数据发送到DMA模块,并从DMA模块中读取返回的数据。最后,我们检查接收到的数据是否与发送的数据匹配,以验证是否存在数据传输错误。在这个过程中,我们可以对DMA传输速度进行测量。
阅读全文