Конфликт памяти Cortex-M4 (DMA против программы)

Я использую контроллер STM32F4xx. Я использовал DMA для буферизации UART (циклических буферов). Меня беспокоит, что если будет конфликт памяти, когда моя программа будет обращаться к той же ячейке памяти в то же время, что и DMA.

Может ли конфликт возникнуть таким образом, или у контроллера есть меры, чтобы этого не произошло?

Спасибо.


person alsaleem    schedule 13.03.2017    source источник
comment
что вы подразумеваете под раздором и что, по вашему мнению, произойдет. У вас может быть несколько транзакций для одного и того же адреса одновременно, и нет причин, по которым память/периферийное устройство не может с этим справиться. Теперь, конечно, есть некоторые исключения, без сомнения, но хорошо спроектированный чип будет ставить транзакции в очередь, оказывать обратное давление на систему или использовать кредиты и обрабатывать все транзакции по мере их поступления.   -  person old_timer    schedule 14.03.2017
comment
конкуренция, как я понял, это одновременный доступ к одной и той же ячейке памяти (либо два DMA, либо DMA+программа). Это может привести к некоторому исключению ошибки. Меня беспокоит, остановится ли прямой доступ к памяти. Это эффект, которого я хочу избежать. Есть шанс, что программа прочитает ту же ячейку, которую заполняет DMA.   -  person alsaleem    schedule 14.03.2017
comment
Конфликт памяти возникает, когда CPU и DMA пытаются получить доступ к одному и тому же блоку памяти через BusMatrix — это не обязательно должно быть одно и то же место. Кроме того, конфликт DMA может возникнуть, если слишком много периферийных устройств передают слишком много данных через DMA.   -  person rsaxvc    schedule 22.12.2018


Ответы (1)


Я нашел это в руководстве STM32F401:

BusMatrix управляет арбитражем доступа между мастерами (CPU, DMA). Арбитраж использует циклический алгоритм.

Может случиться так, что DMA (или ЦП) не сможет выполнить передачу (в нужное время) из-за арбитража. Это вызывает ошибку опустошения/переполнения (в DMA ЦП будет ждать).

Если флаг DMEIFx или FEIFx установлен из-за состояния переполнения или недогрузки, ошибочный поток не отключается автоматически, и программное обеспечение может отключить поток или нет, сбрасывая бит EN в регистре DMA_SxCR. Это связано с тем, что при возникновении ошибок такого рода потери данных не происходит.

person alsaleem    schedule 21.03.2017