Idler (26.09.2014 20:39, просмотров: 242) ответил Apтём на Зачем ДМА иметь высший приоритет? Чтобы ядро вешать?
Высший приоритет - чтобы ДМА делал то, для чего, собственно, был изобретен - для изохронной доставки данных, например, к ЦАПу, видеоконвертеру и т.д. С точностью до фазового джиттера, а не "когда будет время и желание". А процессор - медленно и печально эти данные готовит. Лишь бы успевал. Именно так работают процессоры во всей периферии - и в модемах, и в принтерах, и в сетевых устройствах. И так работает DMA в большинстве процессоров, например в Филипсовских АРМах.
Еще лучше, если ДМА вообще работает прозрачно, как во всех процессорах ADI. На ADSP я замечательно получаю данные каждые 2/3/4... такта процессора. На ХМеге мне нужно было получать байт на порту каждые 9 тактов. Для нормального процессора - фигня, снижение скорости на 11%. А ХМега при любом вызове п/п или прерывания начинает пушить/попить регистры, класть в стек данные и т.д. Десятки команд обращения к памяти подряд. И опаньки... девайс не работает. Пришлось мало того, что все писать на АСМе, да еще по всему тексту прореживать работу с памятью NOPами.
Теперь по поводу остановки ДМА. Нормальный ДМА должен останаливаться сам. Сказали ему переслать Nбайт, он должен их переслать и остановиться, сколько бы дальше не происходило триггерных событий. И так работают ВСЕ остальные, известные мне, процессора. Этот же, при продолжении событий запуска, сначала делает пересылку по следующему адресу (за концом буфера), а потом начинает с начала. Вот представьте себе: кассир хочет 5 тысяч, вы начинаете давать по тысяче, но если он руку не убрал, даете шестую, а потом ключи, документы, штаны... Куда вас отвезут?
Я, конечно, вывернулся на изнанку, но впер туда сверхбыстый обработчик прерывания, который успевает отключить ДМА уже после первой лишней пересылки, и буфер расширил. Работает, но...