nios DMA使用注意事项

本文介绍了在使用DMA操作时应注意的事项,包括避免数据传输错误的方法、数据Cache同步到内存的操作、以及确保数据传输地址对齐的要求。对于Nios CPU而言,在DMA操作前后进行特定设置至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;

转载于:https://www.cnblogs.com/lueguo/p/3414856.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值