Вы чего-то особенного хотите... чтобы ДМА делал то, для чего, собственно, был изобретен - для изохронной доставки данных, например, к ЦАПу, видеоконвертеру и т.д.
ДМА изобретён чтобы не отвлекать ядро на каждую передачу данных пока не передался весь блок.
С точностью до фазового джиттера, а не "когда будет время и желание".
Это часный случай только лишь.
Именно так работают процессоры во всей периферии - и в модемах, и в принтерах, и в сетевых устройствах. И так работает DMA в большинстве процессоров, например в Филипсовских АРМах.
В большинстве ли? Вот про STM32:
The BusMatrix manages the access arbitration between masters. The arbitration uses a
round-robin algorithm.
Так же у EFM32 от EnergyMicro (к примеру) и многих других наверное. Где-то может быть приоритет и настраевается.
Вот от LPC17xx:
AHB arbitration
The Multilayer AHB Matrix arbitrates between several masters. By default, the Cortex-M3 D-code bus has the highest priority, followed by the I-Code bus. All other masters share a lower priority.
Высший приоритет у ядра, остальные - как получится.
На ADSP я замечательно получаю данные каждые 2/3/4... такта процессора.
Так ADSP не МК, а DSP. У них задачи несколько разные.
На ХМеге мне нужно было получать байт на порту каждые 9 тактов.
Ну вы захотели - одна передача занимает минимум 1+2 цикла. Не 11%, а 30.
А ХМега при любом вызове п/п или прерывания начинает пушить/попить регистры, класть в стек данные и т.д.
Все МК так делают. Оптимизацию компилятору не отключили?
да еще по всему тексту прореживать работу с памятью NOPами.
А чего вы хотели? В мануале же написано что у ядра приоритет выше - без NOP-ов никак.
Нормальный ДМА должен останаливаться сам. Сказали ему переслать Nбайт, он должен их переслать и остановиться, сколько бы дальше не происходило триггерных событий.
Так оно вроде так и работает. Все байты передал и канал запретился.
Этот же, при продолжении событий запуска, сначала делает пересылку по следующему адресу (за концом буфера), а потом начинает с начала.
Не попадалось мне такого, но у меня правда запросы каждый десяток тактов не возникали. Может ДМА отключится не успевает за несколько тактов? Если так - то это ошибка конечно.
У меня максимальная частота запросов была пару сотен кГц - никаких лишних передач не было.
Работает, но...
Может у какого-то семейства xmega этот баг появился? У вас какой тип xmega использовался?