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

点击(此处)折叠或打开

  • void dma_done(void *p)
  •     int *q=p;
  •     (*q)++;
  • }
  • main()
  • {
  •     voliate int n1=0,n2=0;
  •     alt_dma_txchan_send(tx1, tx_buf1+BUFSIZE, length, dma_done, &n1); 
  •     alt_dma_txchan_send(tx2, tx_buf2+BUFSIZE, length, dma_done, &n2);
  •    
  •     while(n1!=1);
  •     while(n2!=1);
  •    
  •     alt_dma_rxchan_prepare(rx1, rx_buf1+BUFSIZE, length, dma_done, &n3); 
  •     alt_dma_rxchan_prepare(rx2, rx_buf2+BUFSIZE, length, dma_done, &n4);
  •     while(n3!=1);
  •     while(n4!=1);
  • }



  • 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;

    相关文章: