Перейти к содержанию
    

Как работает DMA в STM32?

Здравствуйте!

Помогите разобраться с работой DMA на нескольких каналах.

Предположим, через DMA1 по UART (это 4-й канал) передаются 100 байт данных.

И на 50-м байте отрабатывает событие передачи-приёма по SPI (2-й канал того же DMA). Что в этом  случае будет: DMA1 будет ожидать полной передачи 100 байт по UART и только потом переключится на SPI или переключиться после того, как перебросит 50-й байт в буфер UART?

Приоритет равный.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Только что, 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 байт и т.д...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня прямо перед носом reference от STM32F4.

И там слова "карусель" нет, есть раздел Arbiter. И там всё просто: у кого выше приоритет (или меньше номер стрима при равных приоритетах) - тот и первый.

 

Другой вопрос, что я использую DMA с низкозагруженными каналами (UART на десятках-сотне кбит/с, SPI с сотней байт и т.д.), и о приоритетах даже не думаю - запас получается на порядки: пока DMA ждёт освобождения высокоприоритетной периферии, он может обслужить низкоприоритетную.

Вот когда мне захочется затолкать что-то большое в периферию с собственным FIFO (что там у STM'ок есть? Только USB с ethernet'ом?) или использовать режим memory-to-memory, вот тогда придётся думать...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

48 минут назад, Arlleex сказал:

Роль активного мастера назначается в этих контроллерах по карусельному типу: контроллер шинных мастеров

Вы не заметили, что у ТС речь идёт об одном и том же контроллере: DMA1, а не о двух разных. Естественно никаких каруселей сам с собой он водить не будет. И для контроллера шины он является одним bus-мастером.

Как обслуживать разные каналы одному контроллеру: определяется конфигурацией - пакетная или непакетная (burst/non-burst) передача и т.п. От того и будет зависеть сколько байт за пересылку будет передано.

Под "100" и "50 байт" автор видимо понимает общий размер блока пересылки. Это блок может состоять из множества транзакций. Вперемежку для разных каналов. Ещё есть зависимость от приоритета канала внутри DMA-контроллера.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Только что, 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, а не о двух разных.

Да, действительно. Каюсь =(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Имелось ввиду - может ли DMA перескакивать с канала на канал с одинаковыми приоритетами? Или пока по первому каналу полностью не отстреляет весь буфер, не прервётся?

Нашёл небольшое описание, но там всё по-английски. Описание

Изменено пользователем di4zerus

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вроде бы, понятно.

Судя по описанию

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.

Изменено пользователем di4zerus

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

34 минуты назад, di4zerus сказал:

В общем, один DMA можно использовать только для чего то одного. Либо канал UART, либо канал SPI.

Почему же? Времени между двумя соседними установками запросов на DMA-транзакции от UART, в сравнении с частотой работы контроллера DMA, настолько много, что, вклинившийся между ними запрос от модуля SPI будет обработан между транзакциями от UART, так что Вы этого даже не заметите. В случае же, когда модули UART и SPI выставят линии запроса DMA одновременно (или наложатся во времени), первым будет обработан тот, чей приоритет выше.

А вот другое дело, если Вы работаете с высокоскоростными источниками/приемниками, например, памятью. В этом случае, при условии, что контроллер один (к примеру, DMA1), низкоприоритетный запрос будет отложен до лучших времен (пока более высокоприоритетный не будет полностью отработан), поскольку низкоприоритетный запрос не сможет "вклиниться" между двумя последовательными запросами более высокого приоритета.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

48 минут назад, di4zerus сказал:

 DMA будет ожидать запроса от другого канала, когда завершит передачу от первого

Вы упустили словосочетание "look for pending requests". Даже если вы зарядите передачу по УАПП максимально возможного блока в 65535 байтов, УАПП будет выдавать тот самый запрос каждый раз при освобождении своего буфера, ПДП передаст байт в буфер УАПП и запрос снимется. И пока УАПП передает этот очередной байт - запрос снят и ПДП вольно заниматься обслуживанием других запросов. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...