Ruslan1 17 16 ноября, 2006 Опубликовано 16 ноября, 2006 · Жалоба Думаю, проблема популярная. Нужно как можно быстрее скопировать данные из одной части адресного пространства в другую. Можно придумать что-то, работающее быстрее, чем memcpy() ? Еще конкретнее: есть устройства с 8- и 16- битной организацией, расположенные в пространстве адресов контроллера StaticMemory. Хочется наиболее оптимально обменяться данными с массивом, расположенным в SDRAM. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 16 ноября, 2006 Опубликовано 16 ноября, 2006 · Жалоба Можно придумать что-то, работающее быстрее, чем memcpy() ? Едва ли: функция memcpy, как правило, очень хорошо оптимизирована. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ruslan1 17 17 ноября, 2006 Опубликовано 17 ноября, 2006 · Жалоба Можно придумать что-то, работающее быстрее, чем 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 для передач "память-память"? Странно, если нету- ведь очень востребованная вещь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doomer#gp 0 17 ноября, 2006 Опубликовано 17 ноября, 2006 · Жалоба Вот 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 17 ноября, 2006 Опубликовано 17 ноября, 2006 · Жалоба Ну ладно, я уже смирился и приспособился. :) Чтение страницы из NAND Flash в память (2112 байт, 8-битная шина) при тактовой шины MCK=25.3MHz, Fcore=101MHz на AT91RM9200 продолжается 2750 us. Из них собственно внутренние дела NAND Flash занимают 23 us, остальное- именно пересылка двух килобайт. Что-то уж слишком медленно получается. По-моему, где-то ошибка. Интересно, а все-таки существуют камни с ядром ARM7 или ARM9, имеющие просто DMA для передач "память-память"? Странно, если нету- ведь очень востребованная вещь. Навскидку: ARM7 - S3C44B0X, ARM9 - EP93xx Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 17 ноября, 2006 Опубликовано 17 ноября, 2006 · Жалоба Странно, если нету- ведь очень востребованная вещь. Прежде чем 'требовать' подумайте а чем занимается контроллер, когда у него отобрали память? В памяти оно конечно 'само все пересылается' а процессор просто стоит, если у него конечно нет кэшей немеряно и продвинутой системы предсказаний для загрузки кэшей.... Ну а чем стоять - мог и пересылать... Короче, DMA в микроконтролерном мире во многих случаях это просто словечко для маркетинга..... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ruslan1 17 17 ноября, 2006 Опубликовано 17 ноября, 2006 · Жалоба Ну ладно, я уже смирился и приспособился. :) Чтение страницы из NAND Flash в память (2112 байт, 8-битная шина) при тактовой шины MCK=25.3MHz, Fcore=101MHz на AT91RM9200 продолжается 2750 us. Из них собственно внутренние дела NAND Flash занимают 23 us, остальное- именно пересылка двух килобайт. Что-то уж слишком медленно получается. По-моему, где-то ошибка. Надеюсь, что так. Сам удивился. Пошуршу еще. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ruslan1 17 17 ноября, 2006 Опубликовано 17 ноября, 2006 · Жалоба Странно, если нету- ведь очень востребованная вещь. Прежде чем 'требовать' подумайте а чем занимается контроллер, когда у него отобрали память? В памяти оно конечно 'само все пересылается' а процессор просто стоит, если у него конечно нет кэшей немеряно и продвинутой системы предсказаний для загрузки кэшей.... Ну а чем стоять - мог и пересылать... Короче, DMA в микроконтролерном мире во многих случаях это просто словечко для маркетинга..... Да пусть хоть совсем стоит и ждет, пока две железяки быстро обменяются с помощью его DMA-контроллера. Цикл шины на источник плюс на приемник и слово передано. Что должно быть не хуже, чем под управлением АЛУ- это очевидно. А насчет "DMA для маркетологов"- совсем не согласен. Скажу про себя- разгружает сильно. Для вссяких там UART/SPI/I2C- это просто спасение. Да и для USB/Ethernet думаю тоже. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vmp 0 17 ноября, 2006 Опубликовано 17 ноября, 2006 · Жалоба А насчет "DMA для маркетологов"- совсем не согласен. Скажу про себя- разгружает сильно. Для вссяких там UART/SPI/I2C- это просто спасение. Да и для USB/Ethernet думаю тоже. Это точно. Можете смеяться, но я сделал один проект на SAM7S вообще без использования прерываний - мне вполне хватило возможностей PDC. Причем там был даже обмен пакетами по UART. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 17 ноября, 2006 Опубликовано 17 ноября, 2006 · Жалоба Для вссяких там UART/SPI/I2C- это просто спасение. Да и для USB/Ethernet думаю тоже. Я бы приоритеты поставил наоборот: спасение для USB/Ethernet, а для всяких UART'ов - приятная мелочь. Можете смеяться, но я сделал один проект на SAM7S вообще без использования прерываний - мне вполне хватило возможностей PDC. Причем там был даже обмен пакетами по UART. А вот мне кажется, что атмел череcчур упорно лепит повсюду свой PDC, забывая, что некоторой периферии желательно еще и FIFO. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MemoryTest 0 17 ноября, 2006 Опубликовано 17 ноября, 2006 · Жалоба А вот мне кажется, что атмел череcчур упорно лепит повсюду свой PDC, забывая, что некоторой периферии желательно еще и FIFO. +1 Я бы от PDC + FIFO не отказался:) А насчет PDC память-память, я согласен с zltigo. тут по любому 1 нужно произвести чтение из памяти, кудато во внутрь процессора 2 это что прочитал записать куда надо. если этим будет заниматься ПДЦ то процессор будет стоять ждать доступа к EBI. мое ИМХО всё это он может сделать сам. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 17 ноября, 2006 Опубликовано 17 ноября, 2006 · Жалоба Скажу про себя- разгружает сильно. Это Вы на чем? На Pentium M? :-))))) Вообще попробуйте как-нибудь попробовать аккуратно реализовать (там, де возможны варианты) и померить. А вот мне кажется, что атмел череcчур упорно лепит повсюду свой PDC Ага, причем если у новых LPC 128bit MAM есть и отдельный банк памяти на отдельной шине для DMA нужд, то у Atmel PDC не бог весть как эффективен, естественно по сравнению с простым FIFO а не по сравнению с совсем тупой железкой без ничего. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ruslan1 17 19 ноября, 2006 Опубликовано 19 ноября, 2006 · Жалоба Скажу про себя- разгружает сильно. Это Вы на чем? На Pentium M? :-))))) Нет, я про многострадальный AT91RM9200. Вообще попробуйте как-нибудь попробовать аккуратно реализовать (там, де возможны варианты) и померить. Что-то я не горю желанием "аккуратно" переписывать, скажем, работу с восьмью разными SPI устройствами. Или обмен на 115200 по Modbus-RTU, чтобы при каждом байтике прерывания возникали. Я заранее уверен, что лучше, чем с использованием PDC, у меня не выйдет. И даже осмелюсь подумать такую крамольную мысль, что выйдет хуже. У меня, разумеется. За других не скажу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 19 ноября, 2006 Опубликовано 19 ноября, 2006 · Жалоба Я заранее уверен, что лучше, чем с использованием PDC, у меня не выйдет. Это я чуть отколонился :-(. Речь вел не о том, что без DMA лучше - с DMA безусловно лучше чем без ничего. А о том, что а Atmel-овской архитетуре DMA отнюдь не более, а менее эффективна, чем "банальные" FIFO. Ну а буде была реализована пересылка память-память и вовсе бесполезна - не горюйте!. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ruslan1 17 20 ноября, 2006 Опубликовано 20 ноября, 2006 · Жалоба Я заранее уверен, что лучше, чем с использованием PDC, у меня не выйдет. Это я чуть отколонился :-(. Речь вел не о том, что без DMA лучше - с DMA безусловно лучше чем без ничего. А о том, что а Atmel-овской архитетуре DMA отнюдь не более, а менее эффективна, чем "банальные" FIFO. Плохость FIFO в том, что: 1. "резиновых" FIFO пока не наблюдается. Сколько байт дали (обычно меньше чем нужно)- через столько и прерывайся. DMA позволяет этого не делать. Одно прерывание на посылку. 2. PDC позволяет не перегружать данные из памяти в FIFO передатчика каждый раз полностью. Например, если у меня PDC и я опрашиваю по петле одно устройство- то просто запускаю еще раз передатчик, так как буфер у меня нетронут. Либо меняю несколько байт в передаваемом пакете и все. Либо просто указываю контроллеру новые указатели для буферов приема/передачи. В случае простого FIFO- все нужно заливать по новой перед каждой передачей. При приеме- тоже грустно. из FIFO обязательно нужно выгребать, а PDC уже сразу кладет данные туда, куда мне нужно. Хм... Чем дольше думаю, тем больше сомнений. Можете привести пример, когда FIFO позволит сэкономить количество обращений с памятью? А если я в качестве буферов для PDC назначу набортное RAM контроллера? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться