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

 
 
> Nios -> DMA, как правильно пользоваться
torik
сообщение Feb 8 2008, 11:01
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 113
Регистрация: 1-11-05
Пользователь №: 10 359



Вот и опять я....)

Ранее был разговор о том, как загружать данные из CFI_FLASH в SDRAM. Была проблема в том что глючно происходила запись. Как выяснилось из документации - виноват кэш. И проблема, соответсвенно решилась использованием макросов IOWR/IORD.

Код перекачки одного кадра изображения из флеша в сдрам получился такой:
Код
    for (i = 0; i < 614400; i++) {
       dst_src = IORD_8DIRECT(CFI_FLASH_0_BASE+f_offset, i);
       IOWR_8DIRECT(SDRAM_0_BASE+d_offset, i, dst_src);
    }


Как вы понимаете - этот метод уже не устраивает, т.к. процессор загружен. Иными словами, я решил разобраться с прямым доступом к памяти DMA. Вот тут-то и возникли проблемы sad.gif, прошу помочь найти ошибку.
Как используем DMA:
Код
   alt_dma_txchan txchan;
    alt_dma_rxchan rxchan;
    int rc, rc1;
    if ((txchan = alt_dma_txchan_open("/dev/dma_0")) == NULL) {rc1 = 2;};
    if ((rxchan = alt_dma_rxchan_open("/dev/dma_0")) == NULL) {rc1 = 3;};
    
    if ((rc = alt_dma_txchan_send (txchan, (void*)(CFI_FLASH_0_BASE+f_offset), 614400, NULL, NULL)) < 0)
    {
        rc1 = 4;
    }
    if ((rc = alt_dma_rxchan_prepare (rxchan, (void*)(SDRAM_0_BASE+d_offset), 614400, dma_done, NULL)) < 0)
    {
        rc1 = 5;
    }
    while (!rx_done);  //инкремент в функции dma_done
    rx_done = 0;


Эта последовательность действий получена на основе примера memtest. Результат плачевный - в дебагере видно, что даже результат первых строчек NULL. Почему не открывается канал?
CFI_FLASH_0_BASE+f_offset = адрес картинки во влеше, источник
SDRAM_0_BASE+d_offset = куда копировать, адрес в ОЗУ

Прилагаю также картинки SOPC и настроек DMA.
Помогите разобраться что не так...
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
 


--------------------
Быть. torizin-liteha@yandex.ru
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
torik
сообщение Feb 12 2008, 17:30
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 113
Регистрация: 1-11-05
Пользователь №: 10 359



Да можно и так, но опыта у меня мало, потому все это займет у меня много времени, а не хотелось бы. Кроме того - дизассемблирование вообще, на мой взгляд - чушь порядочная. Ты когда на visual С++ по windows пишешь и ошибка появляется, тоже "дизассемблируешь"?

Потому и спрашиваю, что наверняка кто-либо уже с этим сталкивался и ошибка весьма примитивна...


--------------------
Быть. torizin-liteha@yandex.ru
Go to the top of the page
 
+Quote Post
id_gene
сообщение Feb 13 2008, 08:40
Сообщение #3


carpe manana
***

Группа: Свой
Сообщений: 321
Регистрация: 2-06-05
Пользователь №: 5 659



Цитата(torik @ Feb 12 2008, 20:30) *
Да можно и так, но опыта у меня мало, потому все это займет у меня много времени, а не хотелось бы. Кроме того - дизассемблирование вообще, на мой взгляд - чушь порядочная. Ты когда на visual С++ по windows пишешь и ошибка появляется, тоже "дизассемблируешь"?
Ну, ваш вопрос висит уже 4 дня, и никто еще не ответил, похоже, что никто не сталкивался с такой проблемой, поэтому не лез в исходники С-файлов. Я, честно говоря, ДМА не использовал, но просто поиском в файлах описания указанной функции не нашел. sad.gif

А отладка займет не так уж много времени, как вам кажется. Главное - найти в исходниках функцию и понять, что она делает. И тут не С++, программа не такая уж сложная. Дизассемблируйте с ключом -S, будет понятнее. Если ключ gcc -O0 (не оптимизировать), то результат будет очень близок к исходнику.

Первый шаг: в отладчике ставите точку останова перед вызовом функции, дожидаетесь останова, далее переключаетесь в режим "instruction stepping mode" и шагаете по коду. Исходники там, кажется, тоже откроются.
Проблема тут в том, что альтера многие свои функции объявляет _inline_ , так что они не всегда у вас "всплывут" при обычной отладке, вы перешагнете через них и не заметите.

Лучше два часа потерять сейчас на простом примере, зато в следующий раз такие проблемы решатся гораздо быстрее. Если вы собираетесь дальше работать с ниосом, применять этот метод вам рано или поздно придется все равно (когда вы начнете писать сложные приложения и драйверы под свои модули).
Удачи
Go to the top of the page
 
+Quote Post



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

 


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


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