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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> NIOSII и DMA, вроде все дёлаю по книжке, но есть интересные моменты..
Kuzmi4
сообщение May 12 2008, 11:49
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 3 304
Регистрация: 13-02-07
Из: 55°55′5″ 37°52′16″
Пользователь №: 25 329



-----
Пересобрал НИОС2 , и решил подобавлять alt_dcache_flush_all в код.
Что самое интересное - если вставить эту функцию после начальной инициализации массивов
Код
for (i=0;i<16;i++)
    {
        inbuffer[i]=0;
        outbuffer[i]=i+1;
    }
    //*******
    alt_dcache_flush_all();
    //*******
    waddr = (alt_u32)&inbuffer[0];
    raddr = (alt_u32)&outbuffer[0];
    buff_length = 8;
    //

Тогда всё ок - по printf -> выдаётся то, что и должно быть
Цитата
!!!inbuffer= 1 2 3 4 5 6 7 8 !!!outbuffer= 1 2 3 4 5 6 7 8 !!!


А если вставить alt_dcache_flush_all после цикла ожидания
Код
while ( IORD_ALTERA_AVALON_DMA_STATUS(DMA_BASE) & (ALTERA_AVALON_DMA_STATUS_BUSY_MSK))
    { // ждем пока все не передаст
        asm volatile ("nop");
    }
    //flush
    //alt_dcache_flush_all();
    //отображение
    printf("!!!");

То выдаётся такое:
Цитата
!!!inbuffer= 0 0 0 0 0 0 0 0 !!!outbuffer= 1 2 3 4 5 6 7 8 !!!

Как это можно объяснить ? smile3046.gif
Ведь в описании комманды flushd , которую собсно и вызывает alt_dcache_flush_all указано, что:
Цитата
Flushes the data cache line associated with address rA + σ (IMM16).

То есть очищает кеш данных асоциированных с адресом таким то..

Почему очистка после ожидания флага не даёт результата ??
wacko.gif
Go to the top of the page
 
+Quote Post
vetal
сообщение May 12 2008, 12:10
Сообщение #17


Гуру
******

Группа: Модераторы
Сообщений: 2 095
Регистрация: 27-08-04
Из: Россия, СПб
Пользователь №: 553



Цитата
Почему очистка после ожидания флага не даёт результата ??

alt_dcache_flush_all() скадывает данные из кэша в озу и производит сброс(инициализацию) кэша. Выполнение функции после отработки дма затирает новые данные старыми.
Вроде так smile.gif
Из словаря promt(информатика): flush- сбрасывать на диск. В нашем случае мочно читать как : перемещать в память.
Go to the top of the page
 
+Quote Post
Kuzmi4
сообщение May 12 2008, 12:49
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 3 304
Регистрация: 13-02-07
Из: 55°55′5″ 37°52′16″
Пользователь №: 25 329



Тогда получатся всё правильно - я инициализирую данные начальными значениями, сбрасываю с кеша в сдрам и сбрасываю кеш, потом запусукаю ДМА , а после процесор смотрит что у него нету этих данных в кеше и берёт с сдрама...
2 vetal - a14.gif

Вот оно как хитро получается...
smile.gif

Прицепил си-шный код, вдруг кому понадобится..
Прикрепленные файлы
Прикрепленный файл  DMA_example.txt ( 2.37 килобайт ) Кол-во скачиваний: 144
 
Go to the top of the page
 
+Quote Post
AlexanderL
сообщение May 28 2008, 17:09
Сообщение #19





Группа: Участник
Сообщений: 10
Регистрация: 22-03-07
Пользователь №: 26 400



Цитата(Kuzmi4 @ May 12 2008, 16:49) *
Вот оно как хитро получается...


молодец, a14.gif +1, я бы даже и не догадался что ДМА так будет работать с кэшируемыми данными
хорошо что раскопал, (у меня были другие проблемы (разрядность brust count и разряднорсть передаваемых данных)), спасибо буду знать.

Сообщение отредактировал AlexanderL - May 28 2008, 17:13
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th August 2025 - 20:16
Рейтинг@Mail.ru


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