roboforum.ru

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

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

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

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

Сообщение dccharacter » 12 фев 2013, 14:48

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

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

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

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

Еще я пытался играть со счетчиками ДМА, но не очень-то получилось. Т.е. пихать данные в тот же самый буфер, С которыми контроллер уже работает и играться указателями.
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

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

Сообщение elmot » 12 фев 2013, 16:08

Вижу 2 варианта:
- можно несколько линейных буферов в очереди держать. Когда передача буфера закончена, переключаемся на следующий.
- Всегда все складывать в кольцевой буфер. DMA отсылает заполненный буфер, по окончании передачи проверяется - не нафигачили ли туда еще чего-нибудь.
Аватара пользователя
elmot
 
Сообщения: 5691
Зарегистрирован: 10 ноя 2011, 12:02
Откуда: Turku, Finland
Skype: elmot73
прог. языки: Java и все-все=все
ФИО: Илья


Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 16