Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Скорость работы с памятью AT91RM9200...
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Paramedic
Использую AT91RM9200 + SDRAM. Приходится работать с изображениями и часто переливать данные из SDRAM и обратно. Протестировал скорость записи и выяснил что на запись слова в SDRAM тратится порядка 6-7 тактов MCK. По-моему это многовато. Нужно как-то повышать производительность.
Вообще SDRAM должна быстрее работать?
Это контроллер SDRAM в выбранном арме такой фиговый или я не так его использую?
Положение ещё усугубляет то, что на отладочной плате чипы памяти какие-то странные, не могу найти даташит, написано на них 8MX16TI и ещё вверху на одном буквы AHC а на другом AGM (что тоже настораживает). Аргуссофт сказал что это прямые аналоги микроновских MT48LC8M16A2.
Если я поставлю вместо SDRAM быструю статическую RAM, на сколько я смогу ощутить прирост производительности при активной работе с памятью?
Gemm
Цитата(Paramedic @ Jun 19 2007, 11:14) *
Использую AT91RM9200 + SDRAM. Приходится работать с изображениями и часто переливать данные из SDRAM и обратно. Протестировал скорость записи и выяснил что на запись слова в SDRAM тратится порядка 6-7 тактов MCK. По-моему это многовато. Нужно как-то повышать производительность.
Вообще SDRAM должна быстрее работать?
Это контроллер SDRAM в выбранном арме такой фиговый или я не так его использую?
Положение ещё усугубляет то, что на отладочной плате чипы памяти какие-то странные, не могу найти даташит, написано на них 8MX16TI и ещё вверху на одном буквы AHC а на другом AGM (что тоже настораживает). Аргуссофт сказал что это прямые аналоги микроновских MT48LC8M16A2.
Если я поставлю вместо SDRAM быструю статическую RAM, на сколько я смогу ощутить прирост производительности при активной работе с памятью?



У меня похожая задача. Для копирования блоков сначала использовал стандартную функцию memcpy (IAR EWB for ARM). Копировалось ужасно медленно. Переписал ее на асме с использованием инструкций LDMIA STMIA - скорости подскочили на порядки. Как делаете Вы?
Paramedic
Цитата(Gemm @ Jun 19 2007, 11:27) *
У меня похожая задача. Для копирования блоков сначала использовал стандартную функцию memcpy (IAR EWB for ARM). Копировалось ужасно медленно. Переписал ее на асме с использованием инструкций LDMIA STMIA - скорости подскочили на порядки. Как делаете Вы?


При обработке изображений у меня не последовательный доступ к памяти, поэтому не использую memcpy. Просто идёт чтение запись попиксельно. Пишу на C в ИАРе, в асме пока не силён. А какая скорость была при использовании memcpy у Вас?
AlexBoy
Цитата(Paramedic @ Jun 19 2007, 10:14) *
Нужно как-то повышать производительность.
Вообще SDRAM должна быстрее работать?

Сильно улучшит ситуацию, если включите все кеши: инструкций и данных, причем данных в режим WriteBack. Соответственно придется задействовать MMU.
У меня общая производительность получалась на уровне 200-го пня.
Paramedic
Цитата(AlexBoy @ Jun 19 2007, 15:07) *
Сильно улучшит ситуацию, если включите все кеши: инструкций и данных, причем данных в режим WriteBack. Соответственно придется задействовать MMU.
У меня общая производительность получалась на уровне 200-го пня.

Всё так и делаю. Вы мне однажды помогли настроить кэши и менеджер памяти соответствующим образом, когда я мучился с тестом производительности. Спасибо Вам! Тогда мне удалось достичь 100 DMIPS при исполнении кода из SDRAM. Но почему-то мне кажется что это не предел производительности. Может быть проблема в "плохой" SDRAM или всё-таки в кривизне моих рук надо искать причину? smile.gif
AlexBoy
Цитата(Paramedic @ Jun 19 2007, 14:35) *
Но почему-то мне кажется что это не предел производительности. Может быть проблема в "плохой" SDRAM или всё-таки в кривизне моих рук надо искать причину? smile.gif

Вспомнил. Попробую запустить у себя тест, если будет сильно отличаться выложу исходники. Мне хватало скорости делать полноэкранную анимацию 800х600 15fps.
Paramedic
Цитата(AlexBoy @ Jun 19 2007, 15:54) *
Вспомнил. Попробую запустить у себя тест, если будет сильно отличаться выложу исходники. Мне хватало скорости делать полноэкранную анимацию 800х600 15fps.


Буду благодарен за тест.
А по поводу 800х600 15fps - это 139 нс на пиксел. Это просто вычитывание из памяти и вывод на экран или ещё какая-то раскодировка? Сколько байт данных на пиксел?
AlexBoy
Цитата(Paramedic @ Jun 19 2007, 15:27) *
Буду благодарен за тест.
А по поводу 800х600 15fps - это 139 нс на пиксел. Это просто вычитывание из памяти и вывод на экран или ещё какая-то раскодировка? Сколько байт данных на пиксел?

Спрайтовая графика, копирование блоков с полупрозрачностью. 1 байт на точку.
Paramedic
Цитата(AlexBoy @ Jun 19 2007, 16:42) *
Спрайтовая графика, копирование блоков с полупрозрачностью. 1 байт на точку.

Простите за назойливость, а полупрозрачность реализована по таблице? Величина спрайтов большая? Я просто хочу понять насколько интенсивной была работа с SDRAM.
AlexBoy
Часть по альфа-таблице (16 градаций), часть по цвету. Макс. размер спрайта 120х120 15шт, и мелких около 20шт. В основном проверки и целочисленное сложение, сдвиги. Многое от компилятора зависит, как он сможет оптимизировать. Пользуюсь RVDS2.2.
Paramedic
Цитата(AlexBoy @ Jun 19 2007, 17:24) *
Часть по альфа-таблице (16 градаций), часть по цвету. Макс. размер спрайта 120х120 15шт, и мелких около 20шт. В основном проверки и целочисленное сложение, сдвиги. Многое от компилятора зависит, как он сможет оптимизировать. Пользуюсь RVDS2.2.

Да, видимо Ваша система пошустрее моей работает с SDRAM... Жду с нетерпением от Вас результатов запуска теста.
AlexBoy
Цитата(Paramedic @ Jun 20 2007, 08:12) *
Да, видимо Ваша система пошустрее моей работает с SDRAM... Жду с нетерпением от Вас результатов запуска теста.

Как обещал выкладываю проект. Скорость максимальная какую смог выжать. Можно еще уменьшить делитель MCK до 2 (90Mhz), но за надежность не отвечаю. Попробуйте залить готовый test.bin из проекта и сравните с результатом компиляции вышим компилятором. Интересно сравнение компиляторов. Мои результаты:
Core Clock: 180Mhz, Master Clock: 60Mhz

*** CPU Speed Test
71.95 BogoMips
472350 Dhrystone per second, 268 DMIPS

*** Memory Speed Test
Block 1Kb, Speed 353552 Kb/s
Block 2Kb, Speed 357616 Kb/s
Block 4Kb, Speed 361936 Kb/s
Block 8Kb, Speed 364148 Kb/s
Block 16Kb, Speed 358666 Kb/s
Block 32Kb, Speed 130316 Kb/s
Block 64Kb, Speed 113957 Kb/s
Block 128Kb, Speed 112377 Kb/s
Block 256Kb, Speed 112338 Kb/s
Block 512Kb, Speed 112345 Kb/s
Block 1024Kb, Speed 112351 Kb/s
Paramedic
Цитата(AlexBoy @ Jun 25 2007, 15:31) *
Как обещал выкладываю проект. Скорость максимальная какую смог выжать. Можно еще уменьшить делитель MCK до 2 (90Mhz), но за надежность не отвечаю. Попробуйте залить готовый test.bin из проекта и сравните с результатом компиляции вышим компилятором. Интересно сравнение компиляторов. Мои результаты:
Core Clock: 180Mhz, Master Clock: 60Mhz

*** CPU Speed Test
71.95 BogoMips
472350 Dhrystone per second, 268 DMIPS

*** Memory Speed Test
Block 1Kb, Speed 353552 Kb/s
Block 2Kb, Speed 357616 Kb/s
Block 4Kb, Speed 361936 Kb/s
Block 8Kb, Speed 364148 Kb/s
Block 16Kb, Speed 358666 Kb/s
Block 32Kb, Speed 130316 Kb/s
Block 64Kb, Speed 113957 Kb/s
Block 128Kb, Speed 112377 Kb/s
Block 256Kb, Speed 112338 Kb/s
Block 512Kb, Speed 112345 Kb/s
Block 1024Kb, Speed 112351 Kb/s



Бинарник не запустился - наверное SDRAM разные. В любом случае у Вас цифры почти в три раза лучше. Буду пробовать компилировать Ваш проект. Спасибо огромное. Как запущу - отпишусь.
AlexBoy
Цитата(Paramedic @ Jun 25 2007, 15:11) *
Бинарник не запустился - наверное SDRAM разные.

Заливали терминалом по Х-модем? порт 11520.8.1
Paramedic
Цитата(AlexBoy @ Jun 25 2007, 16:24) *
Заливали терминалом по Х-модем? порт 11520.8.1

Если Вы имели ввиду скорость 115200 - то да.


Вот что получилось у меня:

Core Clock: 180Mhz, Master Clock: 60Mhz

*** CPU Speed Test
198121 Dhrystone per second, 112 DMIPS

*** Memory Speed Test
Block 1Kb, Speed 57192 Kb/s
Block 2Kb, Speed 57368 Kb/s
Block 4Kb, Speed 57394 Kb/s
Block 8Kb, Speed 57436 Kb/s
Block 16Kb, Speed 57415 Kb/s
Block 32Kb, Speed 44703 Kb/s
Block 64Kb, Speed 42534 Kb/s
Block 128Kb, Speed 42329 Kb/s
Block 256Kb, Speed 42330 Kb/s
Block 512Kb, Speed 42331 Kb/s
Block 1024Kb, Speed 42331 Kb/s
//----------------------------------------------------------------------------------------------------
Правда пришлось по другому настроить контроллер SDRAM (иначе не заработало):

int i;
volatile int *pSDRAM = (int *)BASE_EBI_CS1_ADDRESS;

//* Configure PIOC as peripheral (D16/D31)
AT91F_SDRC_CfgPIO();

//* Setup MEMC to support CS1=SDRAM
AT91C_BASE_EBI->EBI_CSA |= AT91C_EBI_CS1A;
AT91C_BASE_EBI->EBI_CFGR = (AT91C_EBI_DBPUC & 0x00) | (AT91C_EBI_EBSEN & 0x00);

//* Init SDRAM
//* 1. A minimum pause of 200us is provided to precede any signal toggle
AT91C_BASE_SDRC->SDRC_CR = AT91C_SDRC_NC_9 | AT91C_SDRC_NR_12 | AT91C_SDRC_NB_4_BANKS | AT91C_SDRC_CAS_2
| 0x100 | 0x4000 | 0x8000
| 0x880000
| 0x21000000;


//* 2. A Precharge All command is issued to the SDRAM
AT91C_BASE_SDRC->SDRC_MR = AT91C_SDRC_MODE_PRCGALL_CMD;
*pSDRAM = 0;

//* 3. Eight Auto-refresh are provided
AT91C_BASE_SDRC->SDRC_MR = AT91C_SDRC_MODE_RFSH_CMD;
for(i=0;i<8;i++)
*pSDRAM = 0;

//* 4. A mode register cycle is issued to program the SDRAM parameters
AT91C_BASE_SDRC->SDRC_MR = AT91C_SDRC_MODE_LMR_CMD;
*(pSDRAM+0x80) = 0;

//* 5. Write refresh rate into SDRAMC refresh timer COUNT register
AT91C_BASE_SDRC->SDRC_TR = (AT91C_SDRC_COUNT & 0x2E0);
*pSDRAM = 0;

//* 6. A Normal Mode Command is provided, 3 clocks after tMRD is set
AT91C_BASE_SDRC->SDRC_MR = AT91C_SDRC_MODE_NORMAL_CMD;
*pSDRAM = 0;

Странно, но почему-то в цикл теста CalcBogoMips() программа не попадает, не дожидается и вываливается по while((loops_per_sec <<= 1)). Кстати, где в Вашем коде инициализируется системный таймер?
AlexBoy
Цитата(Paramedic @ Jun 25 2007, 16:13) *
Правда пришлось по другому настроить контроллер SDRAM (иначе не заработало):
Странно, но почему-то в цикл теста CalcBogoMips() программа не попадает, не дожидается и вываливается по while((loops_per_sec <<= 1)). Кстати, где в Вашем коде инициализируется системный таймер?

Попробуйте использовать мой модуль AT91_SDRAM.c, только заменить AT91C_SDRC_NC_8 на AT91C_SDRC_NC_9, должно пойти.
Таймер инициализируется там-же в CalcBogoMips, просто задается делитель set_systimer_divider(1);
Можно попробовать увеличить задержку delay_long(0x10000), т.к. после установки делителя таймер вначале выдает бяку.
Странные результаты по скорости памяти, почти нет разницы что внутри кеша, что вне.
P.S.
Добейтесь работы моего проекта с минимальными измерениями иначе не поймем отчего тормозит.
Paramedic
Цитата(AlexBoy @ Jun 25 2007, 18:11) *
Попробуйте использовать мой модуль AT91_SDRAM.c, только заменить AT91C_SDRC_NC_8 на AT91C_SDRC_NC_9, должно пойти.

Странные результаты по скорости памяти, почти нет разницы что внутри кеша, что вне.
P.S.
Добейтесь работы моего проекта с минимальными измерениями иначе не поймем отчего тормозит.


SDRAM заработала когда заменил T91C_SDRC_NC_8 на AT91C_SDRC_NC_9. Но скорости остались такие же.
И еще: функция AT91F_InitPMC() выполняется успешно, только если закоментировать AT91F_EnableMainClock() и AT91F_SetMasterClock(), в противном случае программа виснет. Частоты PLLA, PLLB и MCKL при коментировании вышеназванных функций выставляются правильные.
AlexBoy
Цитата(Paramedic @ Jun 26 2007, 11:15) *
И еще: функция AT91F_InitPMC() выполняется успешно, только если закоментировать AT91F_EnableMainClock() и AT91F_SetMasterClock(), в противном случае программа виснет. Частоты PLLA, PLLB и MCKL при коментировании вышеназванных функций выставляются правильные.

Так в этом и ответ, скорость проца не выставляется, он работает на MainClock (18.432) без умножения.
Номиналы деталей в обвязке PLL правильные?
Пошагово посмотрите где виснет.
Без AT91F_EnableMainClock() не заработает и AT91F_SetMasterClock(). Попробуйте вместо ожидания готовности вставить задержку побольше.
Уберите DBG() на всякий случай.
Перед запуском нужен аппаратный ресет для сброса настроек плл.
Paramedic
Цитата(AlexBoy @ Jun 26 2007, 13:31) *
Так в этом и ответ, скорость проца не выставляется, он работает на MainClock (18.432) без умножения.
Номиналы деталей в обвязке PLL правильные?
Пошагово посмотрите где виснет.
Без AT91F_EnableMainClock() не заработает и AT91F_SetMasterClock(). Попробуйте вместо ожидания готовности вставить задержку побольше.
Уберите DBG() на всякий случай.
Перед запуском нужен аппаратный ресет для сброса настроек плл.


Нет, я навреное не правильно объяснил. Частоты у меня правильные выставляются и процессор работает на 180МГц (смотрел осциллом программируемые клоки). инициализаци возможно не проходит потому что если я работаю с бутлоадером, то инициализация уже там проведена, а если под отладчиком, то тоже в mac-файле настраиваются тактовые. Если бы проц работал на 18МГц, то результаты были б ыгораздо меньше, на эти грабли уже наступал...
Меня насторожило сообщение http://electronix.ru/forum/index.php?showtopic=33473 . Может быть дело в компиляторе? Используемый Вами компилятор где можно найти, не подскажете?
AlexBoy
Цитата(Paramedic @ Jun 26 2007, 12:39) *
Нет, я навреное не правильно объяснил. Частоты у меня правильные выставляются и процессор работает на 180МГц
...
Используемый Вами компилятор где можно найти, не подскажете?

Понял. Можно в mac файле временно отключить установку частоты и глянуть что получится.

Да, для чистоты эксперемента лучше взять такой-же компилятор: RVDS2.2
Есть на местном фтп /pub/MCs/_ARM_/ARM.REALVIEW.DEVELOPER.STUDIO.2.2, если нет доступа, то в муле.
Paramedic
Цитата(AlexBoy @ Jun 26 2007, 13:55) *
Понял. Можно в mac файле временно отключить установку частоты и глянуть что получится.

Так не получается, потому что чтобы загрузить код в SDRAM надо в mac-файле проинициализировать и PLL и SDRAM контроллер...
AlexBoy
Цитата(Paramedic @ Jun 26 2007, 14:23) *
Так не получается, потому что чтобы загрузить код в SDRAM надо в mac-файле проинициализировать и PLL и SDRAM контроллер...

Я не знаю есть ли в IARe понятие scatter файла, т.е. грузить код в SRAM, а после инициализации периферии код перебрасывается в SDRAM. Или ищите RVDS2.2
Paramedic
Цитата(AlexBoy @ Jun 26 2007, 16:02) *
Я не знаю есть ли в IARe понятие scatter файла, т.е. грузить код в SRAM, а после инициализации периферии код перебрасывается в SDRAM. Или ищите RVDS2.2


Удалось запустить Ваш проект под ИАРом с минимальными переделками (только настройки SDRAM вместо 8 Columns поставил 9). BogoMips-тест не запускался, потому что оптимизатор ИАРа пустой цикл просто отказывался выполнять :) Пришлось снизить оптимизацию для функции void delay(int loops).
*** CPU Speed Test
59.96 BogoMips
198203 Dhrystone per second, 112 DMIPS

*** Memory Speed Test
Block 1Kb, Speed 57638 Kb/s
Block 2Kb, Speed 57816 Kb/s
Block 4Kb, Speed 57848 Kb/s
Block 8Kb, Speed 57889 Kb/s
Block 16Kb, Speed 57865 Kb/s
Block 32Kb, Speed 45038 Kb/s
Block 64Kb, Speed 42835 Kb/s
Block 128Kb, Speed 42654 Kb/s
Block 256Kb, Speed 42653 Kb/s
Block 512Kb, Speed 42653 Kb/s
Block 1024Kb, Speed 42655 Kb/s

Вот такие цифры. Итого BogoMips на 16% хуже, Dhrystone в 2,4 хуже, память при малых блоках почти в 7 раз медленнее, а при больших блоках в 2 с небольшим раза медленнее Ваших. Не утешительно. Как думаете, в чём ещё может быть дело? Судя по BogoMips ядро вроде не сильно медленнее работает, а вот когда дело касается памяти и кэшей - всё тормозит...
И ещё: не нашёл в Вашем проекте карты распределения памяти. Вы всё храните в SDRAM? И код, и данные, и стек?
--------------------------------------------------------------------------

Попробовал с выключенным DCACH:
*** CPU Speed Test
59.96 BogoMips
31597 Dhrystone per second, 17 DMIPS
*** Memory Speed Test
...
Block 16Kb, Speed 6501 Kb/s
...
Block 1024Kb, Speed 6502 Kb/s

и с выключенными MMU и DCACH:
*** CPU Speed Test
59.96 BogoMips
29022 Dhrystone per second, 16 DMIPS
*** Memory Speed Test
...
Block 16Kb, Speed 5809 Kb/s
...
Block 1024Kb, Speed 5808 Kb/s

Т.е. можно сделать вывод, что кэширование работает. Но почему так медленно, не понятно.
MemoryTest
получил следующее:
*** CPU Speed Test
71.95 BogoMips
472285 Dhrystone per second, 268 DMIPS

*** Memory Speed Test
Block 1Kb, Speed 353514 Kb/s
Block 2Kb, Speed 357576 Kb/s
Block 4Kb, Speed 361896 Kb/s
Block 8Kb, Speed 364112 Kb/s
Block 16Kb, Speed 358656 Kb/s
Block 32Kb, Speed 130348 Kb/s
Block 64Kb, Speed 113954 Kb/s
Block 128Kb, Speed 112366 Kb/s
Block 256Kb, Speed 112324 Kb/s
Block 512Kb, Speed 112334 Kb/s
Block 1024Kb, Speed 112338 Kb/s

заливал test.bin
AlexBoy
Цитата(Paramedic @ Jun 27 2007, 10:39) *
И ещё: не нашёл в Вашем проекте карты распределения памяти. Вы всё храните в SDRAM? И код, и данные, и стек?

Информация для компилятора в файле t1.scf, а способ кеширования для каждого региона в функции AT91F_InitMMU().
Что могу сказать sad.gif пробуйте другой компилятор.
Paramedic
Цитата(AlexBoy @ Jun 27 2007, 20:07) *
Информация для компилятора в файле t1.scf, а способ кеширования для каждого региона в функции AT91F_InitMMU().
Что могу сказать sad.gif пробуйте другой компилятор.

Компилятор в свободном доступе найти не удалось sad.gif Если не затруднит, не могли бы Вы скомпилировать бинарник на своём компиляторе, исправив настройки SDRAM (вместо 8 Columns поставить 9)?
AlexBoy
Цитата(Paramedic @ Jun 28 2007, 07:53) *
Компилятор в свободном доступе найти не удалось sad.gif Если не затруднит, не могли бы Вы скомпилировать бинарник на своём компиляторе, исправив настройки SDRAM (вместо 8 Columns поставить 9)?

могём.
Paramedic
Цитата(AlexBoy @ Jun 28 2007, 16:49) *
могём.


Спасибо! Наконец-то хоть какой-то результат:
*** CPU Speed Test
71.95 BogoMips
472350 Dhrystone per second, 268 DMIPS

*** Memory Speed Test
Block 1Kb, Speed 353564 Kb/s
Block 2Kb, Speed 361920 Kb/s
Block 4Kb, Speed 364208 Kb/s
Block 8Kb, Speed 366368 Kb/s
Block 16Kb, Speed 360928 Kb/s
Block 32Kb, Speed 130436 Kb/s
Block 64Kb, Speed 113974 Kb/s
Block 128Kb, Speed 112380 Kb/s
Block 256Kb, Speed 112341 Kb/s
Block 512Kb, Speed 112351 Kb/s
Block 1024Kb, Speed 112355 Kb/s

Правда это при условии загрузки бинарника во внутреннюю RAM... Из SDRAM не хочет исполняться почему-то. Может конфликт с моим загрузчиком...

Ладно, сейчас пробую перейти на Кейловский компилятор, может что-то получится...
Paramedic
Цитата(AlexBoy @ Jun 27 2007, 20:07) *
Информация для компилятора в файле t1.scf, а способ кеширования для каждого региона в функции AT91F_InitMMU().
Что могу сказать :( пробуйте другой компилятор.


Раздобыл RVDS 2.2. Пробую собрать Ваш проект, компиляция проходит успешно, а вот линкер ругается:

Error : armlink: L6784: Symbol #65 'bottom_of_stacks' in section #6 'Stacks' from cstartup.o with value 0xfffffef0 has size 0x0 that extends to outside the section.

Error : armlink: L6784: Symbol #66 'StackPointer' in section #6 'Stacks' from cstartup.o with value 0xffffff74 has size 0x0 that extends to outside the section.

Error : armlink: L6784: Symbol #69 'bottom_of_stacks' in section #0 'Stacks' from retarget.o with value 0xfffffef0 has size 0x0 that extends to outside the section.

Error : armlink: L6784: Symbol #70 'StackPointer' in section #0 'Stacks' from retarget.o with value 0xffffff74 has size 0x0 that extends to outside the section.

armlink: Finished: 0 information, 0 warning and 4 error messages.

Error : link exit status = 2

Подскажите, куда надо смотреть и что править, а то я ещё не совсем въехал в структуру проекта. Да и не хочется пока самодеятельность в проект добавлять для чистоты эксперимента. Ваш проект не менял, загрузил как есть...
AlexBoy
Цитата(Paramedic @ Jul 2 2007, 10:07) *
Раздобыл RVDS 2.2. Пробую собрать Ваш проект, компиляция проходит успешно, а вот линкер ругается:
...

Забыл сказать. Нужно скачать update с сайта.
h__p://www.arm.com/support/downloads/info/15304.html
Замененные файлы нужно заново пропатчить.
Тогда errors станут warnings.
А warnings затем можно отключить: Release Settings -> Linker -> RealView Linker -> Diagnostics, в поле Suppress добавить текст 6784.
Paramedic
Цитата(AlexBoy @ Jul 3 2007, 14:54) *
Забыл сказать. Нужно скачать update с сайта.
h__p://www.arm.com/support/downloads/info/15304.html
Замененные файлы нужно заново пропатчить.
Тогда errors станут warnings.
А warnings затем можно отключить: Release Settings -> Linker -> RealView Linker -> Diagnostics, в поле Suppress добавить текст 6784.


Ну что ж, заработало в RVDS как надо, цифры такие-же как у Вас.
Когда в ИАРе переписал функцию memcpy (библиотечная тупо копировала по-байтно...) удалось поднять скорость до 200Mb/c. Богомипсы тоже подтянул до уровня 71, поигравшись с оптимизацией. С отключенной опцией Code moution работает быстрее. Дристоны выжал в ИАРе до 141. Больше не получилось. Есть подозрение, что это из-за неоптимальности функций работы со строками.
Наверное перейду на RVDS, правда пока не удалось запустить отладчик под ним. Жалко слезать с ИАР, до этого под MSP много с ним работал, нравился он мне.

Спасибо Вам огромное, AlexBoy, за такую серьёзную помощь!
AlexBoy
Цитата(Paramedic @ Jul 3 2007, 14:33) *
Когда в ИАРе переписал функцию memcpy...

Рад был помочь.
А можно взглянуть на вашу функцию memcpy?
sergeeff
Самая шустрая memcpy для ARM, что я видел, в netbsd. Полностью на ассеблере. Быстрее, я думаю, нет.
Paramedic
Цитата(AlexBoy @ Jul 3 2007, 15:44) *
Рад был помочь.
А можно взглянуть на вашу функцию memcpy?


Я пробовал просто пословное копирование без выравнивания (в общем случае оно не применимо):
void *memcpy1(void *dst, void *src, size_t length)
{
int *p1 = dst;
int *p2 = src;

for (unsigned int i = 0; i < length/sizeof(int); i += sizeof(int))
*p1++ = *p2++;

return dst;
}
Скорость была на уровне 95Мб/с при копировани больших блоков и 220Мб/с при блоках меньше размера кэша.


Очень хороший результат дала полноценная функция, предложенная zltigo: http://electronix.ru/forum/index.php?act=A...st&id=12141
Скорость была на уровне 100Мб/с при копировани больших блоков и 230Мб/с при блоках меньше размера кэша.
sergeeff
У меня функция из netbsd копирует 1 Mbytes блок за 19 мс при обоих вклученных кэшах.
AlexBoy
Цитата(sergeeff @ Jul 3 2007, 17:50) *
У меня функция из netbsd копирует 1 Mbytes блок за 19 мс при обоих вклученных кэшах.

Получается общая скорость read/write = 105Mb/s.
У меня со стандартной memcpy в RVDS 112Mb/s.
sergeeff
Попробовал функцию от уважаемого zltigo. У меня она отработала за 23 мс, т.е. скорость порядка 87 Мб/с.
Так что советую попробовать вариант netbsd.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.