Полная версия этой страницы:
stm32 usart dma
demiurg_spb
Mar 19 2012, 07:37
Решил тут заюзать dma для stm32 usart, наткнулся на принципиальный момент.
Вводное: отправка нескольких пакетов подряд без ожидания окончания отправки предыдущего пакета и без использования динамической памяти.
Пока остановился на том, что приём по dma, а отправка по прерыванию с fifo. (кособоко как-то...)
Накидайте идейки кто какие может (пусть на первый взгляд и утопические).
Спасибо!
neiver
Mar 19 2012, 08:50
Я думаю можно попробовать так:
1. пул из N блоков байт одинакового размера;
2. блоки организованы в FIFO;
3. берём из пула первый сводный блок и пишем в него пока он не заполнится;
4. помечаем заполненный блок как готовый к отправке;
5. если DMA не еще включен, отправляем заполненный блок;
6. в прерывании DMA по завершении передачи, если есть блоки готовые к передачи, то передаем их;
7. можно поставить в очередь передачи частично заполненный блок (надо хранить кол-во байт в нем), предусмотреть типа функции flush, которую вызавать в конце пакета, или по таймауту;
8. минимальное кол-во блоков - два.
demiurg_spb
Mar 19 2012, 11:01
Спасибо, но думаю что пул из фифо это уже избыточно, должно по идее хватать пула из пары буферов (так проще значительно будет).
Всё равно что второе фифо переполнится, что второй буфер - разницы уже ИМХО большой нет.
Тут наверное имеет смысл увеличивать размер пула (дробить на большее кол-во мелких буферов) чтобы в случае переполнения меньший хвостик херился.
neiver
Mar 19 2012, 11:39
Я именно и предлагаю фифо из блоков, которые лежат в пуле. Проще говоря, механизм работы такой-же как с фифо и отправкой по прерыванию об окончании передачи байта. С той лишь разницей, что в фифо лежат не байты, а блоки.
demiurg_spb
Mar 19 2012, 12:28
Я видимо не так вас понял с первого раза.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.