Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Nios II Interrupt
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
doom13
Приветствую.
В системе имеется несколько источников прерываний:
1) SgDMA Stream To Memory (IRQ #1)
2) Прерывание от PIO (IRQ #0)

На PIO приходит синхроимпульс по которому срабатывает прерывание и запускается SgDMA Memory To Stream. SgDMA Memory To Stream должен за период синхронизации обработать (передать) какое-то количество байт.
Было всё круто, но счас пытаемся выжать максимальную скорость и столкнулся с проблемой - запуск SgDMA Memory To Stream не всегда происходит сразу после прихода синхроимпульса. Иногда запуск SgDMA Memory To Stream происходит с достаточно большой задержкой после прихода синхроимпульса, и, как следствиие, не все данные успевают передаться за период синхронизации. Если отключить прерывания от SgDMA Stream To Memory, то такого не наблюдается.
Видимо, какие-то проблемы с приоритетом прерываний и почемуто прерывание от PIO срабатывает с задержкой. Подскажите куда копать и в чём может быть проблема?
Спасибо.
Stewart Little
Какой контроллер прерываний используете - "софтовый" (Internal) или аппаратный (Vectored Interrupt Controller, VIC)?
doom13
В обработчике прерывания от SgDMA Stream To Memory используются (может быть как-то связано?):
1) alt_remap_cached()
2) alt_avalon_sgdma_construct_stream_to_mem_desc()
3) alt_dcache_flush()
ну и куча IOWR и IORD


Цитата(Stewart Little @ Dec 4 2014, 17:58) *
Какой контроллер прерываний используете - "софтовый" (Internal) или аппаратный (Vectored Interrupt Controller, VIC)?

Использую Internal
Stewart Little
Цитата(doom13 @ Dec 4 2014, 18:01) *
Использую Internal

Не, это не Рио-де-Жанейро sm.gif
Используйте VIC. С точки зрения ниосовского софта ничего переписывать не надо. Но ресурсов FPGA чуть больше понадобится...
Смотрите http://www.altera.com/support/examples/nio...controller.html
doom13
Цитата(Stewart Little @ Dec 4 2014, 21:32) *
Не, это не Рио-де-Жанейро sm.gif
Используйте VIC. С точки зрения ниосовского софта ничего переписывать не надо. Но ресурсов FPGA чуть больше понадобится...
Смотрите http://www.altera.com/support/examples/nio...controller.html

Спасибо, опробую как-нибудь использование VIC.
Пока нашёл основную проблему в использовании SgDMA Memory To Stream. В обработчике прерывания от GPIO запускаю SgDMA Memory To Stream на передачу данных. Для этого использовалась alt_avalon_sgdma_do_sync_transfer(), из-за чего пока не передавались все данные программа висела в данном обработчике и не давала работать другим прерываниям. Ступил, виноват sm.gif
doom13
Похоже, без VIC-a не обойдусь. Необходимо чтобы прерывание от GPIO сработало не зависимо от наличия в данный момент любого другого прерывания, т.е. чтобы всегда по синхроимпульсу перезапускать SgDMA на передачу. Получится ли это с использованием VIC? Пошёл читать...
doom13
Разобрался, разрешение nested interrupts спасает ситуацию, что-то ранее не пользовался вложенностью прерываний для ниоса.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.