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

AT91RM9200: быстрая пересылка память-память

Думаю, проблема популярная.

Нужно как можно быстрее скопировать данные из одной части адресного пространства в другую.

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

 

Еще конкретнее: есть устройства с 8- и 16- битной организацией, расположенные в пространстве адресов контроллера StaticMemory. Хочется наиболее оптимально обменяться данными с массивом, расположенным в SDRAM.

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


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

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

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

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


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

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

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

Ну ладно, я уже смирился и приспособился. :)

Чтение страницы из 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 для передач "память-память"? Странно, если нету- ведь очень востребованная вещь.

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


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

Вот memcpy (GCC 4.1.0, -Os optimization)

00008278 <memcpy>:
    8278:    e3a0c000     mov    ip, #0; 0x0
    827c:    ea000002     b    828c <memcpy+0x14>
    8280:    e7dc3001     ldrb    r3, [ip, r1]
    8284:    e7cc3000     strb    r3, [ip, r0]
    8288:    e28cc001     add    ip, ip, #1; 0x1
    828c:    e2522001     subs    r2, r2, #1; 0x1
    8290:    2afffffa     bcs    8280 <memcpy+0x8>
    8294:    e12fff1e     bx    lr

 

А вот что приведено в ADS Assembler manual в качестве примера демонстрации эффективного использования команд ldm stm при блочном коприровании - двумя последовательными командами копируем 8 двойных слов.

 

                      AREA Block, CODE, READONLY; name this block of code
num                EQU 20; set number of words to be copied
                      ENTRY; mark the first instruction to
start
                     LDR r0, =src; r0 = pointer to source block
                     LDR r1, =dst; r1 = pointer to destination
                     MOV r2, #num; r2 = number of words to copy
                     MOV sp, #0x400; Set up stack pointer (r13)
blockcopy       MOVS r3,r2, LSR #3; Number of eight word multiples
                     BEQ copywords; Less than eight words to move?
                     STMFD sp!, {r4-r11}; Save some working registers
octcopy          LDMIA r0!, {r4-r11}; Load 8 words from the source
                     STMIA r1!, {r4-r11}; and put them at the destination
                     SUBS r3, r3, #1; Decrement the counter
                     BNE octcopy; ... copy more
                     LDMFD sp!, {r4-r11}; Don't need these now - restore
                                                  ; originals
copywords      ANDS r2, r2, #7; Number of odd words to copy
                     BEQ stop; No words left to copy?
wordcopy       LDR r3, [r0], #4; Load a word from the source
                     STR r3, [r1], #4; store it to the destination
                     SUBS r2, r2, #1; Decrement the counter
                     BNE wordcopy; ... copy more
stop               MOV r0, #0x18; angel_SWIreason_ReportException
                     LDR r1, =0x20026; ADP_Stopped_ApplicationExit
                     SWI 0x123456; ARM semihosting SWI

                    AREA BlockData, DATA, READWRITE
src                DCD 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4
dst                DCD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
                     END

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


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

Ну ладно, я уже смирился и приспособился. :)

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

Что-то уж слишком медленно получается. По-моему, где-то ошибка.

 

Интересно, а все-таки существуют камни с ядром ARM7 или ARM9, имеющие просто DMA для передач "память-память"? Странно, если нету- ведь очень востребованная вещь.

Навскидку: ARM7 - S3C44B0X, ARM9 - EP93xx

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


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

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

Прежде чем 'требовать' подумайте а чем занимается контроллер, когда у него отобрали память?

В памяти оно конечно 'само все пересылается' а процессор просто стоит, если у него конечно нет

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

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


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

Ну ладно, я уже смирился и приспособился. :)

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

Что-то уж слишком медленно получается. По-моему, где-то ошибка.

 

Надеюсь, что так. Сам удивился. Пошуршу еще.

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


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

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

Прежде чем 'требовать' подумайте а чем занимается контроллер, когда у него отобрали память?

В памяти оно конечно 'само все пересылается' а процессор просто стоит, если у него конечно нет

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

Да пусть хоть совсем стоит и ждет, пока две железяки быстро обменяются с помощью его DMA-контроллера. Цикл шины на источник плюс на приемник и слово передано. Что должно быть не хуже, чем под управлением АЛУ- это очевидно.

А насчет "DMA для маркетологов"- совсем не согласен. Скажу про себя- разгружает сильно. Для вссяких там UART/SPI/I2C- это просто спасение. Да и для USB/Ethernet думаю тоже.

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


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

А насчет "DMA для маркетологов"- совсем не согласен. Скажу про себя- разгружает сильно. Для вссяких там UART/SPI/I2C- это просто спасение. Да и для USB/Ethernet думаю тоже.

 

Это точно. Можете смеяться, но я сделал один проект на SAM7S вообще без использования прерываний - мне вполне хватило возможностей PDC. Причем там был даже обмен пакетами по UART.

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


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

Для вссяких там UART/SPI/I2C- это просто спасение. Да и для USB/Ethernet думаю тоже.

Я бы приоритеты поставил наоборот: спасение для USB/Ethernet, а для всяких UART'ов - приятная мелочь.

 

Можете смеяться, но я сделал один проект на SAM7S вообще без использования прерываний - мне вполне хватило возможностей PDC. Причем там был даже обмен пакетами по UART.

А вот мне кажется, что атмел череcчур упорно лепит повсюду свой PDC, забывая, что некоторой периферии желательно еще и FIFO.

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


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

А вот мне кажется, что атмел череcчур упорно лепит повсюду свой PDC, забывая, что некоторой периферии желательно еще и FIFO.

+1

Я бы от PDC + FIFO не отказался:)

 

А насчет PDC память-память, я согласен с zltigo.

тут по любому

1 нужно произвести чтение из памяти, кудато во внутрь процессора

2 это что прочитал записать куда надо.

если этим будет заниматься ПДЦ то процессор будет стоять ждать доступа к EBI.

мое ИМХО всё это он может сделать сам.

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


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

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

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

Вообще попробуйте как-нибудь попробовать аккуратно реализовать (там, де возможны варианты) и померить.

 

 

А вот мне кажется, что атмел череcчур упорно лепит повсюду свой PDC

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

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


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

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

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

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

 

Вообще попробуйте как-нибудь попробовать аккуратно реализовать (там, де возможны варианты) и померить.

Что-то я не горю желанием "аккуратно" переписывать, скажем, работу с восьмью разными SPI устройствами. Или обмен на 115200 по Modbus-RTU, чтобы при каждом байтике прерывания возникали. Я заранее уверен, что лучше, чем с использованием PDC, у меня не выйдет. И даже осмелюсь подумать такую крамольную мысль, что выйдет хуже. У меня, разумеется. За других не скажу.

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


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

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

Это я чуть отколонился :-(.

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

реализована пересылка память-память и вовсе бесполезна - не горюйте!.

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


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

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

Это я чуть отколонился :-(.

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

Плохость FIFO в том, что:

1. "резиновых" FIFO пока не наблюдается. Сколько байт дали (обычно меньше чем нужно)- через столько и прерывайся. DMA позволяет этого не делать. Одно прерывание на посылку.

2. PDC позволяет не перегружать данные из памяти в FIFO передатчика каждый раз полностью. Например, если у меня PDC и я опрашиваю по петле одно устройство- то просто запускаю еще раз передатчик, так как буфер у меня нетронут. Либо меняю несколько байт в передаваемом пакете и все. Либо просто указываю контроллеру новые указатели для буферов приема/передачи.

В случае простого FIFO- все нужно заливать по новой перед каждой передачей.

 

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

 

Хм... Чем дольше думаю, тем больше сомнений. Можете привести пример, когда FIFO позволит сэкономить количество обращений с памятью? А если я в качестве буферов для PDC назначу набортное RAM контроллера?

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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