Перейти к содержанию
    

-----

Пересобрал НИОС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:

Ведь в описании комманды flushd , которую собсно и вызывает alt_dcache_flush_all указано, что:

Flushes the data cache line associated with address rA + σ (IMM16).

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

 

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

:wacko:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

alt_dcache_flush_all() скадывает данные из кэша в озу и производит сброс(инициализацию) кэша. Выполнение функции после отработки дма затирает новые данные старыми.

Вроде так :)

Из словаря promt(информатика): flush- сбрасывать на диск. В нашем случае мочно читать как : перемещать в память.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

2 vetal - :a14:

 

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

:)

 

Прицепил си-шный код, вдруг кому понадобится..

DMA_example.txt

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

молодец, :a14: +1, я бы даже и не догадался что ДМА так будет работать с кэшируемыми данными

хорошо что раскопал, (у меня были другие проблемы (разрядность brust count и разряднорсть передаваемых данных)), спасибо буду знать.

Изменено пользователем AlexanderL

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...