alexPec 6 January 30, 2013 Posted January 30, 2013 · Report post Прерывания по количеству выполненых дескрипторов: (ALTERA_AVALON_SGDMA_CONTROL_IE_MAX_DESC_PROCESSED_MSK | (8<<ALTERA_AVALON_SGDMA_CONTROL_MAX_DESC_PROCESSED_OFST) ) т.к. строится зацикленная цепочка дескрипторов и бит PARK установлен, т.е. OWNED_BY_HW не чистится... Не понял, зачем вам по количеству? Вам же все равно после цепочки вызывать прерывания, так вызовите там do_async_transfer за одно. Циклить то зачем, вызывайте то один то другой. Quote Share this post Link to post Share on other sites More sharing options...
Копейкин 0 January 31, 2013 Posted January 31, 2013 (edited) · Report post Мне хотелось по минимуму задействовать процессор, т.к. большой (относительно моей системы) поток данных. Если иметь прерывание в конце цепочки, то нужно иметь пустой (незадействованный) дескриптор в конце. Для 2-х цепочек, соответственно 2 пустых дескриптора. Плюс перезапуск SG-DMA. А так получается замечательно: 1) Цепочка зациклена, перезапуск не требуется 2) Прерывания, в которых только 2 флага (буфер заполнен и верхний/нижний буфер) дёрнуть - минимум операций. На текущий момент: 1) Зациклить дескрипторы получилось 2) Прерывания по числу дескрипторов приходят не в своё время, работаю по прерыванию обработки одного дескриптора + подсчёт прерываний. Edited January 31, 2013 by Копейкин Quote Share this post Link to post Share on other sites More sharing options...
Копейкин 0 January 31, 2013 Posted January 31, 2013 · Report post Посмотрел внимательно на Альтере: ссылка там английским языком сказано: Title Why do I only see one interrupt on the Scatter Gather DMA when enabling the MAX_DESC_PROCESSED interrupt? Description If you are using the MAX_DESC_PROCESSED interrupt from the Scatter Gather DMA you must update the MAX_DESC_PROCESSED field at each interrupt to a new value. The core implements an 8 bit counter which automatically wraps to zero when the count value equals 255. For example, if you wanted the core to generate an interrupt after 2 descriptors were processed continually, you would initially set the MAX_DESC_PROCESSED field to 2 and then upon receiving the first interrupt you would update the MAX_DESC_PROCESSED field to 4, upon receiving the next interrupt update the field to 6 and so on. Получается нужно обновлять состояние регистра управления на каждом прерывании. Без вмешательства процессора не обойтись. А жаль... Quote Share this post Link to post Share on other sites More sharing options...
alexPec 6 January 31, 2013 Posted January 31, 2013 · Report post Получается нужно обновлять состояние регистра управления на каждом прерывании. Без вмешательства процессора не обойтись. А жаль... Ну да, похоже две цепочки как я говорил проще будут. Quote Share this post Link to post Share on other sites More sharing options...
Копейкин 0 January 31, 2013 Posted January 31, 2013 · Report post Я сейчас, как и описывал, сделал бесконечный цикл по дескрипторам и дескрипторы больше не трогаю. Прерывание - по обработке одного дескриптора. В обработчике прерывания считаю количество и устанавливаю флаги. Мне так проще показалось. Quote Share this post Link to post Share on other sites More sharing options...
prussta 0 February 1, 2014 Posted February 1, 2014 · Report post Добрый день! Хочу запустить SGDMA в режиме mem to srteam. Работаю с отладочной платой DE0 от терасик в Quartus II v.11.1, использую Nios II /e. Было решено запустить альтеровский пример с SGDMA и SSRAM( SSRAM(MM) --> (MM)SGDMA(ST) --> (ST)SGDMA(MM) --> SSRAM(MM)) . Я вместо SSRAM использую SDRAM. Пример запускается, прохожу все шаги до while(tx_done == 0) успешно, но здесь все и заканчивается. То есть я не захожу на свой callback function, где меняю значение tx_done. Почему? ДМА не запускается? или м.б. ошибки при сборки в Qsys? Не могу разобраться. Скриншоты и файлы программы прилагаю. SGDMA.rar Quote Share this post Link to post Share on other sites More sharing options...