Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1166288
  • 博文数量: 173
  • 博客积分: 4048
  • 博客等级:
  • 技术积分: 2679
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-12 18:53
文章分类

全部博文(173)

文章存档

2018年(1)

2016年(1)

2013年(1)

2012年(118)

2011年(52)

分类: C/C++

2011-12-08 16:03:29

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

阅读(2167) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~