-
- Спасибо, Коль, за объяснение, всегда приятно тебя читать. Да, DMA
это достаточно несложно, автора видать отпугивает непонятность
реализации. А реализовать его проще всего "поженив" с программным
циркулярным буфером. Тогда "пишущий" в буфер указатель (или лучше
index) будет программный. "Заворачивается" он банальным AND, т.е.
&= . А читающий указатель (или index) выполняется на DMA с тем
нюансом что надо будет обслужить "заворот". - RxTx(28.04.2024 18:05)
- Вот, например: SciFi(3191 знак., 28.04.2024 18:38)
- Хорошо написано. На передачу, я, когда не было риска изменений данных на стороне источника, контроллеру ПДП, вообще передавал ссылку на данные. Не оформляя отдельного буфера передачи, но формируя очередь запросов с указателями на данные и размер. Для передачи кадра данных известного размера, ПДП подходит идеально. - Nikolay_Po(28.04.2024 22:04)
- Так-то всё красиво, да. Но зачем плодить указатели на структуры, я не понял. Все уарты и все каналы dma (которые есть в конкретном процессоре) определены там же, где USART_TypeDef и DMA_Channel_TypeDef. Если он не определён, не сработает инициализация, а если определён - зачем делать свой? Я всю сознательную жизнь просто дефайнил, типа #define PRINT_UART USART1 и т.д. - Idler(28.04.2024 21:17)
- Я видел раньше и когда писал, думал "Нет тут SciFi". Да, очень чистенький код. Идеально я бы сказал. - RxTx(28.04.2024 18:48)
- Да, DMA вариант мне все больше нравится. Тем более вывод у меня
будет через printf строками. Как раз задача для DMA. Можно даже с
Doube Buffer Mode попробовать поиграть. Немножко странно конечно у
меня будет - прием по IRQ а отправка в DMA :) - Mty1(28.04.2024 18:37)
- Как по мне, УАРТ не то место, где ДМА необходим. Понимаю, если надо принимать плотный поток от АЦП, или отправлять что-то много и быстро. Но УАРТ, по нынешним временам, не тот случай. ДМА может сократить кол-во срабатываний прерываний, тем сократив среднюю нагрузку по производительности, но производительности обычно и так навалом. Другое дело длительность прерывания. mr-x(323 знак., 29.04.2024 12:26)
- Почему "странно", это вполне нормально, если входной поток нужно на ходу разгребать. Ну, например, выделить из него команду, адрес и дальнейший поток писать куда надо. А передача - "fire & forget", пусть принимающий думает... - Idler(28.04.2024 21:25)
- В старых STM32 UART примитивный и в отличии даже от древних dsPIC30 начала 2000х не имеет FIFO буфера. Что приводит к тому что прерывания будут дубасить на каждый байт. Тогда даже медленный по нынышним временам 115200 это 115200/10 ( к 8 битам байта еще 1 стартовый и 1 стоповый бит) = 11 520 = 11,5 килогерц. И это только один канал. - RxTx(28.04.2024 18:47)
- Вот, например: SciFi(3191 знак., 28.04.2024 18:38)
- Спасибо, Коль, за объяснение, всегда приятно тебя читать. Да, DMA
это достаточно несложно, автора видать отпугивает непонятность
реализации. А реализовать его проще всего "поженив" с программным
циркулярным буфером. Тогда "пишущий" в буфер указатель (или лучше
index) будет программный. "Заворачивается" он банальным AND, т.е.
&= . А читающий указатель (или index) выполняется на DMA с тем
нюансом что надо будет обслужить "заворот". - RxTx(28.04.2024 18:05)