nios DMA使用注意事项

1、对同一个设备的多次DMA读写操作之间如果并行,有可能会导致数据传输错误。可以在程序中对每次DMA操作进行等待。如下:

点击(此处)折叠或打开

  1. void dma_done(void *p)
  2.     int *q=p;
  3.     (*q)++;
  4. }
  5. main()
  6. {
  7.     voliate int n1=0,n2=0;
  8.     alt_dma_txchan_send(tx1, tx_buf1+BUFSIZE, length, dma_done, &n1); 
  9.     alt_dma_txchan_send(tx2, tx_buf2+BUFSIZE, length, dma_done, &n2);
  10.    
  11.     while(n1!=1);
  12.     while(n2!=1);
  13.    
  14.     alt_dma_rxchan_prepare(rx1, rx_buf1+BUFSIZE, length, dma_done, &n3); 
  15.     alt_dma_rxchan_prepare(rx2, rx_buf2+BUFSIZE, length, dma_done, &n4);
  16.     while(n3!=1);
  17.     while(n4!=1);
  18. }




2、如果使用的nios cpu中带有数据cache,则在进行DMA数据传输之前,要先将要使用的mem对应的cache同步到mem中。如下:
#include <sys/alt_cache.h>
alt_dcache_flush_all();

3、使用dma传输数据时,数据在内存中的地址必须保持与dma传输宽度一致的字节对齐。而且长度也必须
为相应的倍数。例如:
alt_dma_txchan_ioctl(tx, ALT_DMA_SET_MODE_32,NULL);  //设为32位传输模式
alt_dma_txchan_send(tx, data, length, NULL,NULL);
data和length必须为4的倍数。
为保证字节对齐,可以使用:
int __attribute__((aligned(4))) data;
但似乎nios无法进行8字节对齐。因此可以自己用指针来保证指针指向的地址为8的倍数。如下:
alt_u64 buffer[PAGESIZE+1];    
alt_u64 *page=(((int)buffer-1)/8+1)*8;

posted on 2013-11-08 19:22  略过天涯  阅读(761)  评论(0编辑  收藏  举报

导航