di4zerus 0 6 декабря, 2018 Опубликовано 6 декабря, 2018 · Жалоба Здравствуйте! Помогите разобраться с работой DMA на нескольких каналах. Предположим, через DMA1 по UART (это 4-й канал) передаются 100 байт данных. И на 50-м байте отрабатывает событие передачи-приёма по SPI (2-й канал того же DMA). Что в этом случае будет: DMA1 будет ожидать полной передачи 100 байт по UART и только потом переключится на SPI или переключиться после того, как перебросит 50-й байт в буфер UART? Приоритет равный. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 183 6 декабря, 2018 Опубликовано 6 декабря, 2018 · Жалоба Только что, di4zerus сказал: И на 50-м байте отрабатывает событие передачи-приёма по SPI (2-й канал того же DMA). Что в этом случае будет: DMA1 будет ожидать полной передачи 100 байт по UART и только потом переключится на SPI или переключиться после того, как перебросит 50-й байт в буфер UART? Приоритет равный. И не так, и не так. Роль активного мастера назначается в этих контроллерах по карусельному типу: контроллер шинных мастеров поочередно подключает активных мастеров одного приоритета к соответствующей разделяемой шине. Соответственно, вклинивание в транзакции USART каналом SPI может произойти в любой момент (зависит от соотношения скоростей работы UART и SPI). Например: UART посылает 100 байт за 1 секунду, а SPI в тот же самый момент активации отправляет данные со скоростью 3 байта в секунду. Это значит, что примерно через 33 байта, переданных по UART, управление шиной возьмет другой канал DMA и отправит байт по SPI. Потом на момент передачи 66 байт по UART настанет очередь выстрелить байт из SPI, а потом - спустя 99 байт и т.д... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 6 декабря, 2018 Опубликовано 6 декабря, 2018 · Жалоба У меня прямо перед носом reference от STM32F4. И там слова "карусель" нет, есть раздел Arbiter. И там всё просто: у кого выше приоритет (или меньше номер стрима при равных приоритетах) - тот и первый. Другой вопрос, что я использую DMA с низкозагруженными каналами (UART на десятках-сотне кбит/с, SPI с сотней байт и т.д.), и о приоритетах даже не думаю - запас получается на порядки: пока DMA ждёт освобождения высокоприоритетной периферии, он может обслужить низкоприоритетную. Вот когда мне захочется затолкать что-то большое в периферию с собственным FIFO (что там у STM'ок есть? Только USB с ethernet'ом?) или использовать режим memory-to-memory, вот тогда придётся думать... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 6 декабря, 2018 Опубликовано 6 декабря, 2018 · Жалоба 48 минут назад, Arlleex сказал: Роль активного мастера назначается в этих контроллерах по карусельному типу: контроллер шинных мастеров Вы не заметили, что у ТС речь идёт об одном и том же контроллере: DMA1, а не о двух разных. Естественно никаких каруселей сам с собой он водить не будет. И для контроллера шины он является одним bus-мастером. Как обслуживать разные каналы одному контроллеру: определяется конфигурацией - пакетная или непакетная (burst/non-burst) передача и т.п. От того и будет зависеть сколько байт за пересылку будет передано. Под "100" и "50 байт" автор видимо понимает общий размер блока пересылки. Это блок может состоять из множества транзакций. Вперемежку для разных каналов. Ещё есть зависимость от приоритета канала внутри DMA-контроллера. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 183 6 декабря, 2018 Опубликовано 6 декабря, 2018 · Жалоба Только что, esaulenka сказал: У меня прямо перед носом reference от STM32F4. И там слова "карусель" нет, есть раздел Arbiter. И там всё просто: у кого выше приоритет (или меньше номер стрима при равных приоритетах) - тот и первый. Другой вопрос, что я использую DMA с низкозагруженными каналами (UART на десятках-сотне кбит/с, SPI с сотней байт и т.д.), и о приоритетах даже не думаю - запас получается на порядки: пока DMA ждёт освобождения высокоприоритетной периферии, он может обслужить низкоприоритетную. Вот когда мне захочется затолкать что-то большое в периферию с собственным FIFO (что там у STM'ок есть? Только USB с ethernet'ом?) или использовать режим memory-to-memory, вот тогда придётся думать... Цитата 2.1.10 BusMatrix The BusMatrix manages the access arbitration between masters. The arbitration uses a round-robin algorithm. Но это, как уже было замечено выше, "не совсем о том". Только что, jcxz сказал: Вы не заметили, что у ТС речь идёт об одном и том же контроллере: DMA1, а не о двух разных. Да, действительно. Каюсь =( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
di4zerus 0 6 декабря, 2018 Опубликовано 6 декабря, 2018 (изменено) · Жалоба Имелось ввиду - может ли DMA перескакивать с канала на канал с одинаковыми приоритетами? Или пока по первому каналу полностью не отстреляет весь буфер, не прервётся? Нашёл небольшое описание, но там всё по-английски. Описание Изменено 6 декабря, 2018 пользователем di4zerus Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
di4zerus 0 6 декабря, 2018 Опубликовано 6 декабря, 2018 (изменено) · Жалоба Вроде бы, понятно. Судя по описанию Quote Note that the priority scheme of the DMA arbiter will always look for pending request from another channel at data transfer completion. Then it will switch to the channel with pending request of the highest priority. There is no round robin here and transfers with lower priority may never be served if the DMA is kept busy. DMA будет ожидать запроса от другого канала, когда завершит передачу от первого. А значит, если его загрузить длинным буфером по UART на одном канале, то пока он этот буфер весь не протолкнёт, на другие каналы не отвлечётся и SPI посылка или чего то ещё, работающее от DMA, может быть потеряна или очень сильно задержаться. В общем, один DMA можно использовать только для чего то одного. Либо канал UART, либо канал SPI. Изменено 6 декабря, 2018 пользователем di4zerus Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 183 6 декабря, 2018 Опубликовано 6 декабря, 2018 · Жалоба 34 минуты назад, di4zerus сказал: В общем, один DMA можно использовать только для чего то одного. Либо канал UART, либо канал SPI. Почему же? Времени между двумя соседними установками запросов на DMA-транзакции от UART, в сравнении с частотой работы контроллера DMA, настолько много, что, вклинившийся между ними запрос от модуля SPI будет обработан между транзакциями от UART, так что Вы этого даже не заметите. В случае же, когда модули UART и SPI выставят линии запроса DMA одновременно (или наложатся во времени), первым будет обработан тот, чей приоритет выше. А вот другое дело, если Вы работаете с высокоскоростными источниками/приемниками, например, памятью. В этом случае, при условии, что контроллер один (к примеру, DMA1), низкоприоритетный запрос будет отложен до лучших времен (пока более высокоприоритетный не будет полностью отработан), поскольку низкоприоритетный запрос не сможет "вклиниться" между двумя последовательными запросами более высокого приоритета. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 141 6 декабря, 2018 Опубликовано 6 декабря, 2018 · Жалоба 48 минут назад, di4zerus сказал: DMA будет ожидать запроса от другого канала, когда завершит передачу от первого Вы упустили словосочетание "look for pending requests". Даже если вы зарядите передачу по УАПП максимально возможного блока в 65535 байтов, УАПП будет выдавать тот самый запрос каждый раз при освобождении своего буфера, ПДП передаст байт в буфер УАПП и запрос снимется. И пока УАПП передает этот очередной байт - запрос снят и ПДП вольно заниматься обслуживанием других запросов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться