реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> STM32H743 MDMA, Нет передачи в периферию
esaulenka
сообщение Jul 20 2018, 06:50
Сообщение #16


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Цитата(Arlleex @ Jul 19 2018, 15:20) *
Не забывайте только, что одна транзакция DMA Burst не должна пересекать границу 1кБ (вроде), это связано с физическими адресуемыми подчиненными шин.

Какие интересные грабли.
Это каких именно процессоров касается? И где описано?

Этак burst можно применять только в очень ограниченном числе случаев...


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
Arlleex
сообщение Jul 20 2018, 07:06
Сообщение #17


Местный
***

Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264



Цитата(esaulenka @ Jul 20 2018, 10:50) *
Какие интересные грабли.
Это каких именно процессоров касается? И где описано?

Это не грабли. Это документированная особенность построения ядра ARMv7M. В других версиях архитектуры аналогично, только адресная граница физических slave-подсистем (например, памяти) может отличаться от 1кБ. Поэтому, если, например, Вы запустите burst-транзакцию, пересекающую адресную границу одного подчиненного, DMA завершит транзакцию успешно (во флагах статуса), но в действительности часть данных потеряется. Причем DMA не взведет флаги Transfer Error. Ну в STM32 по крайней мере точно так. Вот Вам выдержка из Reference Manual на STM32F4xx, например:
Цитата
The burst configuration has to be selected in order to respect the AHB protocol, where
bursts must not cross the 1 KB address boundary because the minimum address space that
can be allocated to a single slave is 1 KB
. This means that the 1 KB address boundary
should not be crossed by a burst block transfer, otherwise an AHB error would be
generated, that is not reported by the DMA registers
.


Цитата(esaulenka @ Jul 20 2018, 10:50) *
Этак burst можно применять только в очень ограниченном числе случаев...

Ну нет, почему же. Если необходимо передавать данные в периферию, имеющую FIFO, то одной burst-транзакцией можно сразу заполнить в нем место, и пусть отправляет куда хочет там.
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Jul 20 2018, 12:43
Сообщение #18


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Да, неправ, это место просмотрел... Благо объемы у меня небольшие, и разгонять DMA не требуется - до включения burst'а руки так и не дошли...

Но это означает, что работу с буфером больше 1кБ надо обкладывать дополнительными проверками.
И маленький буфер тоже по-хорошему выравнивать надо (блин, как же в gcc это неудобно...).


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Jul 20 2018, 13:26
Сообщение #19


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Цитата
И маленький буфер тоже по-хорошему выравнивать надо

На рахмер строки кэша (32 байта) да. Я так понимаю речь про килобайт? Так это можно и в динамике сделать (делить на chunks передаваемые блоки). Но это все на этапе проектирования понятно - можно менеджера памяти нагрузить требованиями по выравниванию, например. Если он есть, конечно.
Go to the top of the page
 
+Quote Post
Arlleex
сообщение Jul 20 2018, 14:23
Сообщение #20


Местный
***

Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264



Цитата(esaulenka @ Jul 20 2018, 16:43) *
Но это означает, что работу с буфером больше 1кБ надо обкладывать дополнительными проверками.
И маленький буфер тоже по-хорошему выравнивать надо (блин, как же в gcc это неудобно...).

Если речь про ограничение в 1кБ - то не забывайте, это только для burst-передач, которые, в общем-то, обычно ограничены десятками-сотней байт. Если это обычная транзакция DMA (не burst) - можете передавать сколько угодно, ограничение только DMA делает на количество данных, передаваемых в одном сеансе транзакции (для STM32 это 64кБ).

Цитата(Genadi Zawidowski @ Jul 20 2018, 17:26) *
Но это все на этапе проектирования понятно - можно менеджера памяти нагрузить требованиями по выравниванию, например. Если он есть, конечно.

ИМХО, лучше сразу все продумать на этапе составления программы и разлиновки памяти. Динамические диспетчеры так или иначе такты процессора тратят. И тем более было бы ради чего - а тут все буфера статически разместить можно еще на этапе обдумывания структуры проекта.
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 14th July 2025 - 00:10
Рейтинг@Mail.ru


Страница сгенерированна за 0.01391 секунд с 7
ELECTRONIX ©2004-2016