реклама на сайте
подробности

 
 
> ZYNQ 7000, DMA и Xil_In32, Xil_Out32
sheynmanyu
сообщение Feb 6 2018, 13:02
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 5-07-17
Пользователь №: 97 975



Здравствуйте!
Задача: передать в память DDR со счетчика, расположенного в PL, 512 32-разрядных слов (2 пакета по 256 слов), минимально задействовав процессор. Выбрала передачу через ядро DMA + InterConnect.
Режим работы DMA - не Scatter/Gather, а просто через регистры.
Инициализирую DMA так:
Код
    unsigned int tmpVal;
    Xil_Out32( XPAR_PS7_GPIO_0_BASEADDR + (2 * XGPIOPS_DATA_MASK_OFFSET) + XGPIOPS_DATA_LSW_OFFSET, 0xFFFD0000); //reset fifo - reset it
    Xil_Out32(XPAR_AXI_DMA_0_BASEADDR + 0x30, (1<<RESET_DMA)); //start_DMA_control_reg_val);
        while(Xil_In32(XPAR_AXI_DMA_0_BASEADDR + 0x30) & (1<<RESET_DMA)) xil_printf("Reseting DMA...\n");
    tmpVal = Xil_In32 (XPAR_AXI_DMA_0_BASEADDR + 0x30);
    tmpVal |= 0x1001;  //dma unit enable. interrupt on complete enable
    Xil_Out32(XPAR_AXI_DMA_0_BASEADDR + 0x30, tmpVal);
    tmpVal = Xil_In32 (XPAR_AXI_DMA_0_BASEADDR + 0x30);
    xil_printf("value for DMA control reg is %x\n\r",tmpVal);
    Xil_Out32 (XPAR_AXI_DMA_0_BASEADDR + 0x48, addr);

Обработка прерываний от DMA:
Код
        u32 tmpVal = Xil_In32 (XPAR_AXI_DMA_0_BASEADDR + 0x34);
    
***********
        xil_printf("DMA status %x\n",tmpVal);         //I can't understand, but without this line CPU reading the length of written bytes from DMA fails...
***********
        
         if((tmpVal&(1<<ERR_IRQ))||(tmpVal&(1<<4)))   //reset DMA if DMA Internal error
    {
            XGpioPs_WritePin(&my_Gpio, 54, 0);   //Закончить работу счетчика
            tmpVal = Xil_In32 (XPAR_AXI_DMA_0_BASEADDR + 0x30);
            tmpVal &= ~0x1001;  //dma unit disable. interrupt on complete disable
            Xil_Out32(XPAR_AXI_DMA_0_BASEADDR + 0x30, tmpVal);
            xil_printf("DMA stopped! Data weren't accepted! Sorry!\n");
            finished = 2;   //It would be good to stop DMA?
    }
    else
    {
        tmpVal = Xil_In32 (XPAR_AXI_DMA_0_BASEADDR + 0x58);

***********
        xil_printf("tmpVal is %d\n",tmpVal);
***********

        Max_num = Max_num + tmpVal;
        if((Max_num)<MAX_BYTE_NUMBERS)
        {
            addr = addr + tmpVal;
            StartDMATransfer(addr,MAX_BYTE_NUMBERS-Max_num);
        }
        else
        {
                //тут заканчиваем передачу
              XGpioPs_WritePin(&my_Gpio, 54, 0); //Закончить работу счетчика
         }

Если в коде нет строчек, выделенных **************, то передается не вся посылка, а примерно 280-290 слов. Если есть - передается всё. и в режиме Release, и в режиме Debug. DMA ошибок не выдает. Выполняется команда XGpioPs_WritePin(&my_Gpio, 54, 0); //Закончить работу счетчика
раньше того как будут переданы все слова. MAX_BYTE_NUMBERS = 2048.
Объясните пожалуйста, почему??? Шаманство "добавим вывод в uart и все заработает" мне не сильно нравится. Хотелось бы понять, сколько времени нужно на выполнение операции чтения-записи в память, и как обойтись без uart?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
dmitry-tomsk
сообщение Feb 6 2018, 14:11
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 672
Регистрация: 18-02-05
Пользователь №: 2 741



В system файле щёлкаете на example напротив dma контроллера и копируете оттуда poll_example. Там несколько строчек кода, заблудиться сложно.
Go to the top of the page
 
+Quote Post
sheynmanyu
сообщение Feb 6 2018, 15:32
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 5-07-17
Пользователь №: 97 975



Цитата(dmitry-tomsk @ Feb 6 2018, 17:11) *
В system файле щёлкаете на example напротив dma контроллера и копируете оттуда poll_example. Там несколько строчек кода, заблудиться сложно.

Это не является ответом на мой вопрос. Возможно, это станет решением. Но я, даже после просмотра примера (а мой код создавался изначально на основе этого примера и еще каких-то найденных в сети), я не понимаю, ПОЧЕМУ у меня НОРМАЛЬНО ПЕРЕДАЮТСЯ данные после вставки двух функций вывода строк в uart.
Go to the top of the page
 
+Quote Post
RobFPGA
сообщение Feb 6 2018, 17:38
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 214
Регистрация: 23-12-04
Пользователь №: 1 643



Приветствую!

Цитата(sheynmanyu @ Feb 6 2018, 18:32) *
Это не является ответом на мой вопрос. Возможно, это станет решением. Но я, даже после просмотра примера (а мой код создавался изначально на основе этого примера и еще каких-то найденных в сети), я не понимаю, ПОЧЕМУ у меня НОРМАЛЬНО ПЕРЕДАЮТСЯ данные после вставки двух функций вывода строк в uart.
Скорее всего потому что добавляется задержка до момента когда вы останавливаете счетчик или DMA.
Вывод в uart или в printf это довольно медленные функции. Смотрите по какому событию у Вас настроено прерывание DMA.
Может оно срабатывает не на окончание пересылки данных, а например на окончание обработки дескриптора.

Удачи! Rob.
Go to the top of the page
 
+Quote Post



Closed TopicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 25th June 2025 - 11:04
Рейтинг@Mail.ru


Страница сгенерированна за 0.01382 секунд с 7
ELECTRONIX ©2004-2016