Народ, помогите придумать, как правильно использовать DMA для вывода данных, например, в консоль. У меня сейчас реализована функция печати в буффер, по окончании которой дергается контроллер ДМА, ему передается адрес буфера и количество байт на отправку, контроллер дальше работает сам.
Проблема в том, что функция печати может быть вызвана в момент, когда предыдущая операция не закончена. Функция отключит контроллер, перезапишет адрес буфера и начнет передачу новой информации. Старая информация при этом просто не будет передана. Можно, конечно, делать проверку и, например, ждать до окончания предыдущей операции, но это сводит на нет все преимущества использования ДМА.
Использование временного буфера для хранения данных до окончания предыдущей операции также проблему не решает, так как вызовов может быть больше чем один.
Есть идея сделать кольцевой пре-буфер. Т.е. если предыдущая операция не завершена, то складываем данные в кольцевой пребуфер. По окончании операции копируем из пребуфера все накопившиеся данные и суем их в рабочий буфер для работы контроллера.
Еще я пытался играть со счетчиками ДМА, но не очень-то получилось. Т.е. пихать данные в тот же самый буфер, С которыми контроллер уже работает и играться указателями.