roboforum.ru

Технический форум по робототехнике.

Использование DMA для вывода данных в консоль (STM32)

Использование DMA для вывода данных в консоль (STM32)

dccharacter » 12 фев 2013, 14:48

Народ, помогите придумать, как правильно использовать DMA для вывода данных, например, в консоль. У меня сейчас реализована функция печати в буффер, по окончании которой дергается контроллер ДМА, ему передается адрес буфера и количество байт на отправку, контроллер дальше работает сам.

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

Использование временного буфера для хранения данных до окончания предыдущей операции также проблему не решает, так как вызовов может быть больше чем один.

Есть идея сделать кольцевой пре-буфер. Т.е. если предыдущая операция не завершена, то складываем данные в кольцевой пребуфер. По окончании операции копируем из пребуфера все накопившиеся данные и суем их в рабочий буфер для работы контроллера.

Еще я пытался играть со счетчиками ДМА, но не очень-то получилось. Т.е. пихать данные в тот же самый буфер, С которыми контроллер уже работает и играться указателями.

Re: Использование DMA для вывода данных в консоль (STM32)

elmot » 12 фев 2013, 16:08

Вижу 2 варианта:
- можно несколько линейных буферов в очереди держать. Когда передача буфера закончена, переключаемся на следующий.
- Всегда все складывать в кольцевой буфер. DMA отсылает заполненный буфер, по окончании передачи проверяется - не нафигачили ли туда еще чего-нибудь.


Rambler\'s Top100 Mail.ru counter