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

 
 
> AT91RM9200: быстрая пересылка память-память, ПДП- то для этого нету :(
Ruslan1
сообщение Nov 16 2006, 08:33
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025



Думаю, проблема популярная.
Нужно как можно быстрее скопировать данные из одной части адресного пространства в другую.
Можно придумать что-то, работающее быстрее, чем memcpy() ?

Еще конкретнее: есть устройства с 8- и 16- битной организацией, расположенные в пространстве адресов контроллера StaticMemory. Хочется наиболее оптимально обменяться данными с массивом, расположенным в SDRAM.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
aaarrr
сообщение Nov 16 2006, 21:23
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата
Можно придумать что-то, работающее быстрее, чем memcpy() ?

Едва ли: функция memcpy, как правило, очень хорошо оптимизирована.
Go to the top of the page
 
+Quote Post
Ruslan1
сообщение Nov 17 2006, 07:06
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025



Цитата(aaarrr @ Nov 17 2006, 00:23) *
Цитата
Можно придумать что-то, работающее быстрее, чем memcpy() ?

Едва ли: функция memcpy, как правило, очень хорошо оптимизирована.

Ну ладно, я уже смирился и приспособился. smile.gif
Чтение страницы из NAND Flash в память (2112 байт, 8-битная шина) при тактовой шины MCK=25.3MHz, Fcore=101MHz на AT91RM9200 продолжается 2750 us. Из них собственно внутренние дела NAND Flash занимают 23 us, остальное- именно пересылка двух килобайт.

Вот еще прочитал в одном документе, описывающем драйвер NAND Flash (одно из моих устройств тоже NAND-Flash). Пишут о наличии нужного DMA в платформах на базе ядра ARM7TDMI. Только непонятно, речь идет о случае "память-память" или "NANDflash-память". Да и что за камни это имеют, интересно.

Написано следующее:
Код
Below is an example for a platform based on
ARM7TDMI core:
#ifdef DMA_ENABLE
do
i=*(volatile udword*) (GDMACON0);
while ( (i&0x2) != 0);
*((volatile unsigned int*) (GDMASRC0)) = Base_Address;
*((volatile unsigned int*) (GDMADST0)) = (udword)Buffer;
*((volatile unsigned int*) (GDMACNT0)) = udLength[0];
*(volatile unsigned int*) (GDMACON0) = 0x0081;
udIndex+=udLength[0];
#endif


А, вот, нашел, о ком это они: Samsung KS32C50100.
Это конкретно NAND Flash можно на DMA повесить. Круто.

Интересно, а все-таки существуют камни с ядром ARM7 или ARM9, имеющие просто DMA для передач "память-память"? Странно, если нету- ведь очень востребованная вещь.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 17 2006, 13:40
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Ruslan1 @ Nov 17 2006, 09:06) *
Странно, если нету- ведь очень востребованная вещь.

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Ruslan1
сообщение Nov 17 2006, 14:41
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025



Цитата(zltigo @ Nov 17 2006, 16:40) *
Цитата(Ruslan1 @ Nov 17 2006, 09:06) *

Странно, если нету- ведь очень востребованная вещь.

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

Да пусть хоть совсем стоит и ждет, пока две железяки быстро обменяются с помощью его DMA-контроллера. Цикл шины на источник плюс на приемник и слово передано. Что должно быть не хуже, чем под управлением АЛУ- это очевидно.
А насчет "DMA для маркетологов"- совсем не согласен. Скажу про себя- разгружает сильно. Для вссяких там UART/SPI/I2C- это просто спасение. Да и для USB/Ethernet думаю тоже.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 17 2006, 18:28
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Ruslan1 @ Nov 17 2006, 16:41) *
Скажу про себя- разгружает сильно.

Это Вы на чем? На Pentium M? :-)))))
Вообще попробуйте как-нибудь попробовать аккуратно реализовать (там, де возможны варианты) и померить.


Цитата(aaarrr @ Nov 17 2006, 17:59) *
А вот мне кажется, что атмел череcчур упорно лепит повсюду свой PDC

Ага, причем если у новых LPC 128bit MAM есть и отдельный банк памяти на отдельной шине для DMA нужд, то у Atmel PDC не бог весть как эффективен, естественно по сравнению с простым FIFO а не по сравнению с совсем тупой железкой без ничего.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Ruslan1
сообщение Nov 19 2006, 22:34
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025



Цитата(zltigo @ Nov 17 2006, 21:28) *
Цитата(Ruslan1 @ Nov 17 2006, 16:41) *

Скажу про себя- разгружает сильно.

Это Вы на чем? На Pentium M? :-)))))

Нет, я про многострадальный AT91RM9200.

Цитата(zltigo @ Nov 17 2006, 21:28) *
Вообще попробуйте как-нибудь попробовать аккуратно реализовать (там, де возможны варианты) и померить.

Что-то я не горю желанием "аккуратно" переписывать, скажем, работу с восьмью разными SPI устройствами. Или обмен на 115200 по Modbus-RTU, чтобы при каждом байтике прерывания возникали. Я заранее уверен, что лучше, чем с использованием PDC, у меня не выйдет. И даже осмелюсь подумать такую крамольную мысль, что выйдет хуже. У меня, разумеется. За других не скажу.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 19 2006, 22:41
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Ruslan1 @ Nov 20 2006, 00:34) *
Я заранее уверен, что лучше, чем с использованием PDC, у меня не выйдет.

Это я чуть отколонился :-(.
Речь вел не о том, что без DMA лучше - с DMA безусловно лучше чем без ничего. А о том, что а Atmel-овской архитетуре DMA отнюдь не более, а менее эффективна, чем "банальные" FIFO. Ну а буде была
реализована пересылка память-память и вовсе бесполезна - не горюйте!.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Ruslan1
сообщение Nov 20 2006, 10:07
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025



Цитата(zltigo @ Nov 19 2006, 22:41) *
Цитата(Ruslan1 @ Nov 20 2006, 00:34) *

Я заранее уверен, что лучше, чем с использованием PDC, у меня не выйдет.

Это я чуть отколонился :-(.
Речь вел не о том, что без DMA лучше - с DMA безусловно лучше чем без ничего. А о том, что а Atmel-овской архитетуре DMA отнюдь не более, а менее эффективна, чем "банальные" FIFO.

Плохость FIFO в том, что:
1. "резиновых" FIFO пока не наблюдается. Сколько байт дали (обычно меньше чем нужно)- через столько и прерывайся. DMA позволяет этого не делать. Одно прерывание на посылку.
2. PDC позволяет не перегружать данные из памяти в FIFO передатчика каждый раз полностью. Например, если у меня PDC и я опрашиваю по петле одно устройство- то просто запускаю еще раз передатчик, так как буфер у меня нетронут. Либо меняю несколько байт в передаваемом пакете и все. Либо просто указываю контроллеру новые указатели для буферов приема/передачи.
В случае простого FIFO- все нужно заливать по новой перед каждой передачей.

При приеме- тоже грустно. из FIFO обязательно нужно выгребать, а PDC уже сразу кладет данные туда, куда мне нужно.

Хм... Чем дольше думаю, тем больше сомнений. Можете привести пример, когда FIFO позволит сэкономить количество обращений с памятью? А если я в качестве буферов для PDC назначу набортное RAM контроллера?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 20 2006, 12:29
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Ruslan1 @ Nov 20 2006, 09:07) *
При приеме- тоже грустно. из FIFO обязательно нужно выгребать,

Чуть-чуть глянем подальше, но начном сначала
- FIFO нужно "выгребать", а DMA (уже писал) "само", но у контроллер без кэшей и отдельных банков
на отдельной переферийной шине просто "стоит".
Цитата
а PDC уже сразу кладет данные туда, куда мне нужно.

А свой тему топика поднятую Вами помните? Что-то мне подсказывает, что DMA положил Вам
куда-то совсем сырой поток данных, потом Вы захотели с ним слегка разобраться, ну там фреймы выделить, контрольные суммы подсчитать, битые пакеты выринуть, перезапросы сделать....
А уж только после этого положить не тольлько куда надо, но и то, что надо. Обработка сырого потока
так или иначе нужна почти всегда, с DMA получаете дополнительные пересылки память-память буквально на ровном месте.
Цитата
Можете привести пример, когда FIFO позволит сэкономить количество обращений с памятью?

См. Выше.


Цитата(sergeeff @ Nov 20 2006, 10:55) *
Как-то наткнулся у Intel на статейку, где сравнивается использование FIFO и DMA. Советую почитать.

Реально много работал с AMD186CC, тот-же UART (кстати много более продвинутый нежели от
Intel и 32bit интерфейсом и прочими вкусностями) имеет и FIFO и DMA. Пробовал, думал....
в результате работает с FIFO. Причины изложены выше.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Ruslan1
сообщение Nov 21 2006, 12:39
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025



Цитата(zltigo @ Nov 20 2006, 12:29) *
А свой тему топика поднятую Вами помните?

Да. Напоминаю:
Я: спросил, как можно быстрее передать данные, чем через memcpy(), и еще посетовал на отсутствие PDC для этого процесса.
Мне: PDC- это фигня по сравнению с FIFO.
Я: не вижу, чем FIFO лучше чем PDC.


Цитата(zltigo @ Nov 20 2006, 12:29) *
Что-то мне подсказывает, что DMA положил Вам
куда-то совсем сырой поток данных, потом Вы захотели с ним слегка разобраться, ну там фреймы выделить, контрольные суммы подсчитать, битые пакеты выринуть, перезапросы сделать....

Как? Где Вы экономите? Я так и не понял. Конкретный пример приведите, как FIFO экономит пересылки при подсчете контрольной суммы? Или как FIFO помогает определить битый пакет?


Цитата(zltigo @ Nov 20 2006, 12:29) *
А уж только после этого положить не тольлько куда надо, но и то, что надо. Обработка сырого потока
так или иначе нужна почти всегда, с DMA получаете дополнительные пересылки память-память буквально на ровном месте.

Так уж получилось, что я постоянно решаю задачи, в которых обработка сырого потока до момента его полного приема бессмысленна. То есть есть критерии завершения, которые я могу описать контроллеру PDC до начала обмена, и просто ждать прерывания по событию "конец приема". У Вас же, наверное, ситуация обратная.


Цитата(zltigo @ Nov 20 2006, 12:29) *
Реально много работал с AMD186CC, тот-же UART (кстати много более продвинутый нежели от
Intel и 32bit интерфейсом и прочими вкусностями) имеет и FIFO и DMA. Пробовал, думал....
в результате работает с FIFO. Причины изложены выше.

Ну что ж. А у меня ситуация обратная. Мой протокол хорошо ложится на PDC, вот и все. И FIFO ну никак не облегчит мне жизнь.



Цитата(zltigo @ Nov 20 2006, 16:05) *
Далеко и ходить не надо - SLIP - хороший, стандартный и правильный пакетный протокол и будет "туши свет".....

Ну а если у меня постоянно MODBUS-RTU, который хорошо ложится на имеющийся PDC? Что мне теперь, протокол менять, чтобы неудобно было? smile.gif

Цитата(zltigo @ Nov 20 2006, 16:05) *
Повторюсь :-( Ни FIFO, ни DMA сами по себе не лучше и не хуже, просто довольно часто приходится слышать о DMA (в случае простых контроллеров!) как о чем-то абсолютно прекрасном, так вот это не так, к сожалению.

Это да. Нет в мире совершенства. Кому что нравится. Мне- PDC, Вам- FIFO.
cheers.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 21 2006, 13:38
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Ruslan1 @ Nov 21 2006, 11:39) *
Да. Напоминаю:
Я: спросил, как можно быстрее передать данные, чем через memcpy(), и еще посетовал на отсутствие PDC для этого процесса.

Тогда ВЫНУЖДЕН напомнить свой ответ ПОЛНОСТЬЮ:
Цитата
Прежде чем 'требовать' подумайте а чем занимается контроллер, когда у него отобрали память?
В памяти оно конечно 'само все пересылается' а процессор просто стоит, если у него конечно нет
кэшей немеряно и продвинутой системы предсказаний для загрузки кэшей.... Ну а чем стоять - мог и пересылать... Короче, DMA в микроконтролерном мире во многих случаях это просто словечко для маркетинга.....

Это похоже?????? на Вашу интерпретацию моего ответа:
Цитата
Мне: PDC- это фигня по сравнению с FIFO.


Цитата
Мой протокол хорошо ложится на PDC, вот и все.

Зачем тогда сожаление об отсутствие пересылок память-память? Я полагаю (уже писал), что имеет место быть необходимость после того, как отработало DMA c железом наконец переслать несколько обработанную принятую информацию в "правильное" место. Есть еще какие-то причины? Я лично могу назвать еще только одну - ошибки в проектировании системы приводящие к необходимости такой лишней пересылки.

Цитата
Кому что нравится. Мне- PDC, Вам- FIFO.

Нравится/не нравится это НЕ МОЙ ПОДХОД. Если есть выбор, то я выбираю наиоптимальнейший вариант не руководствуясь понятием "нравится" и стереотипами ( например, по отношению к затронутому здесь
DMA).
Чего и Вам желаю!


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Ruslan1
сообщение Nov 22 2006, 12:17
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025



Цитата(zltigo @ Nov 21 2006, 13:38) *
Цитата(Ruslan1 @ Nov 21 2006, 11:39) *

Да. Напоминаю:
Я: спросил, как можно быстрее передать данные, чем через memcpy(), и еще посетовал на отсутствие PDC для этого процесса.

Тогда ВЫНУЖДЕН напомнить свой ответ ПОЛНОСТЬЮ:
Цитата
Прежде чем 'требовать' подумайте а чем занимается контроллер, когда у него отобрали память?
В памяти оно конечно 'само все пересылается' а процессор просто стоит, если у него конечно нет
кэшей немеряно и продвинутой системы предсказаний для загрузки кэшей.... Ну а чем стоять - мог и пересылать... Короче, DMA в микроконтролерном мире во многих случаях это просто словечко для маркетинга.....

Это похоже?????? на Вашу интерпретацию моего ответа:
Цитата
Мне: PDC- это фигня по сравнению с FIFO.


Тогда ВЫНУЖДЕН привести еще один Ваш ответ:

Цитата(zltigo @ Nov 19 2006, 22:41) *
Речь вел не о том, что без DMA лучше - с DMA безусловно лучше чем без ничего. А о том, что а Atmel-овской архитетуре DMA отнюдь не более, а менее эффективна, чем "банальные" FIFO.

Извините, Вы действительно не говорили, что "PDC- это фигня по сравнению с FIFO". Вы сказали, что "в Atmel-овской архитетуре DMA отнюдь не более, а менее эффективна, чем "банальные" FIFO".
Вероятно, моя интерпретация этой фразы оказалась слишком вольной.

Цитата(zltigo @ Nov 21 2006, 13:38) *
Цитата(Ruslan1 @ Nov 21 2006, 11:39) *

Мой протокол хорошо ложится на PDC, вот и все.

Зачем тогда сожаление об отсутствие пересылок память-память? Я полагаю (уже писал), что имеет место быть необходимость после того, как отработало DMA c железом наконец переслать несколько обработанную принятую информацию в "правильное" место. Есть еще какие-то причины? Я лично могу назвать еще только одну - ошибки в проектировании системы приводящие к необходимости такой лишней пересылки.

Ну зачем так прямолинейно? Предствьте себе более сложную картину мироздания. У меня для работы с некоторой периферией есть PDC, которые я успешно использую. Но также есть и другие устройства, для которых этих PDC нет, а правила работы с устройствами навязаны их производителем.
Конкретно- NAND FLASH. Вот для нее-то мне и не хватает аналогичного контроллера, облегчающего жизнь. Еще пример- пересылка больших объемов (размером с экран) из SDRAM в контроллер дисплея. Тоже очень помогло бы наличие аппаратного "насоса". Вышеупомянутое- пример устройств, так или иначе отображенных на память, и если бы у меня был аппаратных контроллер для пересылок "память-память", он бы довольно хорошо уменьшил требуемое на эти операции время.
О тривиальных пересылках внутри той же SDRAM я не говорю- это действительно вызвано часто не необходимостью, а применением плохого программиста.


Цитата(zltigo @ Nov 21 2006, 13:38) *
Цитата(Ruslan1 @ Nov 21 2006, 11:39) *

Кому что нравится. Мне- PDC, Вам- FIFO.

Нравится/не нравится это НЕ МОЙ ПОДХОД. Если есть выбор, то я выбираю наиоптимальнейший вариант не руководствуясь понятием "нравится" и стереотипами ( например, по отношению к затронутому здесь
DMA).

Согласитесь, под "нравиться" можно подразумевать комплекс причин, влияющих в том числе и на "оптимальность". А под "оптимальностью" можно подразумевать и банальную скорость достижения результата, что запросто может определяться личными предпочтениями программиста. Но это философский вопрос, не будем развивать.

Цитата(zltigo @ Nov 21 2006, 13:38) *
Чего и Вам желаю!

Спасибо!
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Ruslan1   AT91RM9200: быстрая пересылка память-память   Nov 16 2006, 08:33
|- - vmp   Цитата(Ruslan1 @ Nov 17 2006, 17:41) А на...   Nov 17 2006, 15:28
|- - vmp   Цитата(zltigo @ Nov 20 2006, 12:29) А сво...   Nov 20 2006, 15:53
||- - zltigo   Цитата(vmp @ Nov 20 2006, 14:53) Разумеет...   Nov 20 2006, 16:05
- - doomer#gp   Вот memcpy (GCC 4.1.0, -Os optimization) Код000082...   Nov 17 2006, 07:12
- - aaarrr   Цитата(Ruslan1 @ Nov 17 2006, 10:06) Ну л...   Nov 17 2006, 13:02
|- - Ruslan1   Цитата(aaarrr @ Nov 17 2006, 16:02) Цитат...   Nov 17 2006, 14:30
- - aaarrr   Цитата(Ruslan1 @ Nov 17 2006, 17:41) Для ...   Nov 17 2006, 15:59
|- - SpiritDance   Цитата(aaarrr @ Nov 17 2006, 15:59) А вот...   Nov 20 2006, 10:53
- - MemoryTest   ЦитатаА вот мне кажется, что атмел череcчур упорно...   Nov 17 2006, 18:15
- - sergeeff   Как-то наткнулся у Intel на статейку, где сравнива...   Nov 20 2006, 11:55


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

 


RSS Текстовая версия Сейчас: 31st July 2025 - 04:42
Рейтинг@Mail.ru


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