?? dma
字號:
/*
* 聲明:本范例源于書籍‘NiosII軟件架構解析’
* 作者:蔡偉綱
* 博客地址: http://NiosII.cublog.cn
*
* 一、功能: DMA(Memory to Memory)驅動演示代碼.
* 二、運行前提: 本范例需要硬件開發板的支持,
* 要求NiosII系統包含名為”dma”的DMA模塊,
* 且DMA的長度寄存器應當大于10位,支持字傳輸;
*/
#include <stdio.h>
#include <stdlib.h>
#include "sys/alt_dma.h"
#include "altera_avalon_dma_regs.h"
#include "system.h"
#include <sys/alt_cache.h>
//定義DMA傳輸長度
#define TRANSFER_LENGTH 1024
static volatile int rx_done = 0;
//定義DMA傳輸結束后的回調函數,它將在DMA傳輸結束后被系統自動調用;
//通過簡單的rx_done++,可告知主程序DMA已經完成傳輸任務;
static void done(void* handle, void* data)
{
rx_done++;
}
int main(int argc, char* argv[], char* envp[])
{
printf ("DMA Demo(Memory to Memory)!\n");
int return_code;
alt_dma_txchan txchan;
alt_dma_rxchan rxchan;
//開辟源緩沖區,本范例將把源緩沖區的數據傳輸到目的緩沖區;
//TRANSFER_LENGTH不可過大,否則可能導致堆棧溢出;
char source[TRANSFER_LENGTH];
//開辟目的緩沖區,該緩沖區將接收來自DMA接收通道的數據;
//并通過與源緩沖區數據的對比來確定DMA傳輸是否正確;
//TRANSFER_LENGTH不可過大,否則可能導致堆棧溢出;
char dest[TRANSFER_LENGTH];
//將源緩沖區的數據全部初始化為0x55;
memset(source, 0x55, TRANSFER_LENGTH);
//清空數據緩存,確保源緩沖區的數據正確初始化;
alt_dcache_flush_all();
//創建DMA發送通道;
if((txchan = alt_dma_txchan_open("/dev/dma")) == NULL)
{
printf ("Failed to open transmit channel\n");
exit(1);
}
else
{
printf ("Create the transmit channel successfully!\n");
}
//創建DMA接收通道;
if((rxchan = alt_dma_rxchan_open("/dev/dma")) == NULL)
{
printf ("Failed to open receive channel\n");
exit(1);
}
else
{
printf ("Create the receive channel successfully!\n");
}
//提交DMA發送請求;
if((return_code = alt_dma_txchan_send(txchan,
source,
TRANSFER_LENGTH,
NULL,
NULL)) < 0)
{
printf ("Failed to post transmit request, reason = %i\n", return_code);
exit (1);
}
else
{
printf ("Post the transmit request successfully!\n");
}
//提交DMA接收請求;
if ((return_code = alt_dma_rxchan_prepare(rxchan,
dest,
TRANSFER_LENGTH,
done,
NULL)) < 0)
{
printf ("Failed to post read request, reason = %i\n", return_code);
exit (1);
}
else
{
printf ("Post the receive request successfully!\n");
}
//等待DMA傳輸結束;
while(rx_done == 0);
int Loop, ErrorCount = 0;
for(Loop = 0; Loop < TRANSFER_LENGTH; Loop++)
{
//對比源緩沖區和目的緩沖區的數據;
if(source[Loop] != dest[Loop])
{
printf("Verify failed at location: 0x%X\n",Loop);
ErrorCount++;
}
}
if(ErrorCount == 0)
{
printf ("Transfer successfully!\n");
}
else
{
printf("Transfer failed!\n");
}
while(1);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -