Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: stm32 usart dma
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
demiurg_spb
Решил тут заюзать dma для stm32 usart, наткнулся на принципиальный момент.
Вводное: отправка нескольких пакетов подряд без ожидания окончания отправки предыдущего пакета и без использования динамической памяти.

Пока остановился на том, что приём по dma, а отправка по прерыванию с fifo. (кособоко как-то...)

Накидайте идейки кто какие может (пусть на первый взгляд и утопические).

Спасибо!
neiver
Я думаю можно попробовать так:
1. пул из N блоков байт одинакового размера;
2. блоки организованы в FIFO;
3. берём из пула первый сводный блок и пишем в него пока он не заполнится;
4. помечаем заполненный блок как готовый к отправке;
5. если DMA не еще включен, отправляем заполненный блок;
6. в прерывании DMA по завершении передачи, если есть блоки готовые к передачи, то передаем их;
7. можно поставить в очередь передачи частично заполненный блок (надо хранить кол-во байт в нем), предусмотреть типа функции flush, которую вызавать в конце пакета, или по таймауту;
8. минимальное кол-во блоков - два.
demiurg_spb
Спасибо, но думаю что пул из фифо это уже избыточно, должно по идее хватать пула из пары буферов (так проще значительно будет).
Всё равно что второе фифо переполнится, что второй буфер - разницы уже ИМХО большой нет.
Тут наверное имеет смысл увеличивать размер пула (дробить на большее кол-во мелких буферов) чтобы в случае переполнения меньший хвостик херился.
neiver
Я именно и предлагаю фифо из блоков, которые лежат в пуле. Проще говоря, механизм работы такой-же как с фифо и отправкой по прерыванию об окончании передачи байта. С той лишь разницей, что в фифо лежат не байты, а блоки.
demiurg_spb
Я видимо не так вас понял с первого раза.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.