Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Рациональное применение DMA
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
SasaVitebsk
Доброго времени суток. Делаю новое изделие. Проект большой. FreeRTOS, GLCD+GUI, измерения и так далее. Проц stm32f407. Из сетевых - 3 порта USART c MODBUS + ETHERNET. Хотелось бы создать одну задачу по USART и запустить 3 экземпляра. Есть следующий вопрос. Просматривается, что при реализации посредством DMA объём потребляемой памяти увеличится. Кроме того с ETERNET никогда ранее не работал. Поэтому оценить пока не могу. Планирую LwIP применить. Возможно ещё при записи на AT45DB применю DMA, хотя это и не критично. Там объём работы незначителен.
Так вот вопрос. Не слишком ли много будет загрузки шины. 3 USART + ETH. Может при такой загрузке эфективность будет падать и выигрыш будет близкий к нулю, а расход памяти увеличится? Один USART будет плотно загружен на 115200 для примера. Остальные эпизодически. На ETH тоже MODBUS/TCP. То есть загрузка врятли плотная.
Кто подскажет в общих чертах? Стоит ли связываться с DMA на USART?
_Pasha
Не, падажжите. sm.gif
Если у Вас модбас на усартах, то хоть в RTU хоть в ASCII варианте DMA реально работает только по передаче. Правильно?
А на прием - чем оно поможет? При этом с трудом можно представить ситуацию, чтобы шину подгрузить. Это к ETH надо еще штук 40 усартов, чтобы проблема была...
ЗЫ
Все равно при приеме уарта и crc16 на лету надо считать и таймауты сбрасывать либо SOF/CR/LF ловить.
jcxz
Вообще не понимаю зачем народ так упорно пытается юзать UART через DMA???
Ну конечно если скорости из ряда стандартных до 115200 (если больше - тогда ещё есть резон).
При скорости 115200 частота прерываний при программной реализации == 115200/10/14 == 823Гц (TX IRQ ещё меньше) - для такого процессора это несущественно (даже на частотах <48МГц тактовой загрузка CPU на ISR будет не более сотых долей процента).
И гемору на порядок меньше.
dimka76
Цитата(jcxz @ Dec 20 2012, 08:59) *
115200/10/14 == 823Гц (TX IRQ ещё меньше)


Откуда /14 ?
И почему по TX должно быть меньше, чем по RX ?
jcxz
Цитата(dimka76 @ Dec 20 2012, 11:14) *
Откуда /14 ?
И почему по TX должно быть меньше, чем по RX ?

От FIFO. На RX максимальный уровень срабатывание события == 14, TX - вроде после полного опустошения буфера.
Или на STM не так?
Flexz
У stm32 нет фифо на уартах.
jcxz
Цитата(Flexz @ Dec 20 2012, 12:10) *
У stm32 нет фифо на уартах.

Да??? фуууу......
И как их можно сравнивать с нормальными LPC???
wink.gif
_Pasha
Цитата(Flexz @ Dec 20 2012, 10:10) *
У stm32 нет фифо на уартах.

Это еще поспорить можно. Фифо на 4хх делается на основе DMA с циклическим поинтером.

Но сказано жеж: модбас. Куда там фифо на приём?
Flexz
Цитата(_Pasha @ Dec 20 2012, 10:45) *
Это еще поспорить можно. Фифо на 4хх делается на основе DMA с циклическим поинтером.

Вы не в маркетинге случайно работаете? sm.gif
_Pasha
Цитата(Flexz @ Dec 20 2012, 11:12) *
Вы не в маркетинге случайно работаете? sm.gif

После таких слов можно смело (ногами) открывать дверь и требовать, чтобы оне поставили на довольствие агентом влияния. sm.gif
scifi
Цитата(SasaVitebsk @ Dec 20 2012, 00:17) *
Не слишком ли много будет загрузки шины.

Кстати, этот вопрос не имеет отношения к DMA, так как загрузка шины скорее зависит от объёма трафика, а не от способа его обработки. Ну и, как сказано выше, чтобы перегрузить шину, надо очень постараться. Обратите внимание, что там не просто шина, а Bus Matrix, то есть допускает одновременную передачу не пересекающихся потоков.

Цитата(SasaVitebsk @ Dec 20 2012, 00:17) *
Может при такой загрузке эфективность будет падать и выигрыш будет близкий к нулю, а расход памяти увеличится?

Не нужно заниматься преждевременной оптимизацией: как известно, это всегда приводит к лишнему геморрою и почти никогда - к реальной пользе. Как уже сказали выше, сделайте на прерываниях: так проще, а существенный выигрыш от DMA тут не просматривается.
jcxz
Цитата(_Pasha @ Dec 20 2012, 12:45) *
Но сказано жеж: модбас. Куда там фифо на приём?
А в чём проблема? FIFO с модбас и на приём прекрасно работает.

Цитата(scifi @ Dec 20 2012, 15:56) *
Ну и, как сказано выше, чтобы перегрузить шину, надо очень постараться. Обратите внимание, что там не просто шина, а Bus Matrix, то есть допускает одновременную передачу не пересекающихся потоков.
У меня шина на Cortex-M3 NXP изредка перегружается при 2-х параллельно работающих SSP через DMA (по 2 потока tx/rx), один SSP SCLK=20МГц, другой - SCLK=30МГц. Байтовый режим, пакетная передача, CPU_CLK==120МГц
Flexz
Цитата(jcxz @ Dec 20 2012, 14:48) *
У меня шина на Cortex-M3 NXP изредка перегружается...

а как вы это определили?
jcxz
Цитата(Flexz @ Dec 20 2012, 17:37) *
а как вы это определили?

Если поставить управление линией SSEL от SSP, то изредка (раз на неск. сотен-тысяч транзакций) сигнал SSEL прерывается. SSP-мастер.
Если поставить управление SSEL от GPIO - всё ок, или если снизить частоты SCLK ниже некоторых значений, то тоже прерывания SSEL пропадали.
Хотя, возможно, проблема была в чём-то другом......
SasaVitebsk
Цитата(jcxz @ Dec 20 2012, 07:59) *
Вообще не понимаю зачем народ так упорно пытается юзать UART через DMA???

biggrin.gif
Нет, как раз и не пользовал. Вот и спрашивал, стоит ли начинать. Правда, на LPC fifo на 16 байт было иможно было пакетом обрабатывать. Там вообще не парился.
Кстати здесь CRC зато есть. ))
===
Спасибо всем за советы. Так и поступлю. Программный UART. Если что, то потом перепишу. Лучше поупираюсь с at45db. Хотя там у меня тоже объёмы очень небольшие и смысла большого тоже не просматривается.
jcxz
Цитата(SasaVitebsk @ Dec 21 2012, 01:27) *
Кстати здесь CRC зато есть. ))

В LPC177x/LPC178x тоже есть.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.