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

  • 相关阅读:
    git将已存在的项目转换成git项目&托管git服务器
    联合索引
    MyISAM和InnoDb的关系
    NPOIHelper
    C# CRC各种转换
    appcloud 微信分享大图片
    C# 微信JSSDK 获取配置信息
    简易delegate委托
    GPS、谷歌、百度、高德坐标相互转换
    反射执行方法WINFROM
  • 原文地址:https://www.cnblogs.com/lueguo/p/3414856.html
Copyright © 2020-2023  润新知