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

 
 
4 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> Перенос проекта с AVR на ARM7. Информация к размышлению., Результаты тестов для интересующихся.
SasaVitebsk
сообщение Jun 25 2009, 21:47
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



*** Побудительные мотивы написания.
Часто возникает вопрос выбора камня. Мы видим кучу таких постов. Некоторых это раздражает. Но на самом деле, для меня, причины этого очевидны. Давайте порассуждаем. Провести сравнительные исследования пары камней для текущего проекта - невозможно. Во-первых потому, что для этого надо сделать этот проект на двух платформах полностью, а потом провести исследования. Это, как мы понимаем увеличит затраты времени и денег почти в 2 раза. Кто на это пойдёт? Ориентироваться на сторонние оценки (статьи) - тоже сложно. Поскольку исследования стоят дорого, то бесплатно их никто не делает. Соответственно они проплачены. Как правило одним из производителей. Соответственно они достаточно тенденциозны. То есть, как правило,
идёт выпячивание достоинств и замалчивание недостатков у "нужных" камней, ну а у конкурентов - наоборот. Поэтому живое общение с кучей мнений, намного интересней. Особенно если приведены сравнительные данные.
Мне как раз пришлось переносить один проект с ATMega640 на LPC2106. Плюс особенность проекта такова, что есть возможность дать чёткую оценку производительности на данном проекте. С точки зрения аппаратной части - это почти сопоставимые проекты. То есть платка контроллера на 640 работает в том же железе что и 2106 и, при тестировании выполняют ту же задачу. Есть некоторое различие в выводе. Так, на 640 я использую 2 аппаратных канала SPI, а на 2106 один формирую програмно. На 640 я использую 8 ног камня напрямую, а в 2106 ч/з сдвиговый регистр и тоже программно. С одной стороны это несколько ухудшает точность сравнения, а с другой стороны более полно отражает свойства камня. Нет второго SPI - всё равно придётся пользовать
совтовый, не хватает мощности на выходе - приходится применять аппаратные средства с соответствующей программной обработкой. smile.gif Короче точное сопоставление, но для этого проекта.
Я буду описывать два этапа. На первом этапе я перенёс проект "как есть". При том, что он был "вылизан" под 8-ми битовую архитектуру, обработка, во многих местах выполнялась таблично, для ускорения. Много работы с указателями, оптимизированной под 8-ми битную архитектуру. Некоторые важные части "оптимизированы" под AVR. В тоже время всё было написано на IAR C. На втором этапе, я переоптимизирую на работу с 32-ух битной архитектурой.


*** Производительность. Тестовое сравнение.
1-ый этап. Сопоставление по объёму флэш памяти. Некоторые примечания. От проекта требуется только производительность. Соответственно выбиралась настройка максимальной оптимизации по скорости. Проект и там и там влазит с запасом. Необходимо учесть, что порядка 1.5к на ARM "потерялось" в таблицах при выравнивании (это учтено в данных ч/з "/"). Надо понимать, что если бы ставилась задача оптимизации по размеру, то эту потерю я мог бы легко устранить. Но, поскольку,флэши у меня вагон, то я просто не буду этого делать. Соответственно, сравнение по флэши - чисто оценочное, для реального проекта, для любознательных. Кроме того, проект я пишу в режиме ARM, по вышеперечисленным причинам. В таблице приведены результаты компиляции
проекта так же в режиме THUMB, но это чисто для информации. Полного тестирования проекта в этом режиме не осуществлялось. Ну и кроме того, надо учесть, что в данном проекте около половины занимают таблицы.
smile.gif
Код
-----------------------------------------------------------------
Камень                  ! Mega640 ! LPC2106 THUMB ! LPC2106 ARM !
-----------------------------------------------------------------
CODE  memory (в байтах) !   52428 !   64728/62944 ! 69899/68115 !
-----------------------------------------------------------------
CODE  memory (в %)      !     100 !       123/120 !     133/130 !
-----------------------------------------------------------------

Загрузка до оптимизации
Код
-------------------------------------------------
Камень                  ! Mega640 ! LPC2106 ARM !
-------------------------------------------------
Средняя (мкс)           !   4809  !      721    !
-------------------------------------------------
Средняя (%)                !   28,9  !      4,3    !
-------------------------------------------------
Максимальная (мкс)      !   8008  !     1142    !
-------------------------------------------------
Максимальная (%)        !   48,0  !      6,9    !
-------------------------------------------------
Таким образом рост производительности при переходе на ARM на данной задаче составил от 6.7 до 7 раз. Только за счёт увеличения тактовой и архитектуры процессора. Без оптимизации вычислений под 32 среду.

Проверил оптимизационные способности компилятора IAR. smile.gif
Загрузка при уровне оптимизации "NONE" компилятора IAR.
Код
----------------------------------------------------
Камень                  ! макс. опт. !    "NONE"   !
----------------------------------------------------
Средняя (мкс)           !    721     !     1591    !
----------------------------------------------------
Средняя (%)                !    4,3     !      9,5    !
----------------------------------------------------
Максимальная (мкс)      !    1142    !     2631    !
----------------------------------------------------
Максимальная (%)        !     6,9    !     15,8    !
----------------------------------------------------
Рост производительности программы при полной оптимизации составляет около 2 раз. То есть даже неоптимизированная компилятором и человеком прога на ARM уделает AVR приблизительно в 3 раза (на моей задаче).

Далее начал оптимизацию проги под 32 бита. Оптимизации подверглось 1 прерывание (FIQ) + 6 подпрограмм. Остальное косметически. В целом это составляет приблизительно 10% от объёма проекта. Корректировать остальное нецелесообразно, да и не хочется, для совместного сопровождения задач. Даю таблицу результирующих измерений.

Загрузка после перевода на 32 бита (ряд групповых вычислений)
Код
-------------------------------------------------
Камень                  ! Mega640 ! LPC2106 ARM !
-------------------------------------------------
Средняя (мкс)           !   4809  !      515    !
-------------------------------------------------
Средняя (%)                !   28,9  !      3,1    !
-------------------------------------------------
Максимальная (мкс)      !   8008  !      857    !
-------------------------------------------------
Максимальная (%)        !   48,0  !      5,1    !
-------------------------------------------------
Как видим коэффициент 9.3. Думаю результат в комментариях не нуждается.
Для объективности отмечу, что проект ещё подразбух. Конечный объём стал 70051 байт.

*** IAR, портирование, ошибки.
Компилятор IAR я выбирал по основному критерию - возможность портирования проекта на другие камни. Надо сказать - я очень доволен результатом. Фактически претензий к компилятору нет ни одной. Я при создании проекта сразу выбираю максимальную оптимизацию по нужному мне ресурсу и больше к этому не возвращаюсь.

При переносе этого проекта было несколько хомутов в кусочках, связанных с работой оборудования. Пару изменений связанные с выравниванием я сделал без ошибок. И были ошибки в кусочке, связанном с коррекцией проекта, в связи с отсутствием внутренней EEPROM памяти у LPC.

Некоторые выводы и рекомендации.
1) Что было правильно сделано и ускорило перенос.
Библиотеки были написаны в 2 уровнях. Ну например - I2C. Одна библиотека формирует start/stop/wb/rb. Написаны варианты для совтовой реализации и для аппаратной (TWI). А "над ней" библиотеки работы с 24c и т.п. Библиотеки нижнего уровня написаны таким образом, что взаимо заменяемы. Таким образом библиотеки верхнего уровня получились аппаратно-независимы и их менять не пришлось. Пришлось просто переписать библиотеки нижнего уровня под LPC.
2) Что было неверно сделано. Работа с внутренним EEPROM под AVR.
Как бы я всё равно остаюсь сторонником реализации IARом __eeprom, но надо было также разделить уровни работы. Точнее для AVR необходимо было ввести уровень работы с конфигурацией. В таком случае, для LPC, мне только бы пришлось написать нижний уровень, который "встроен" в компилятор AVR. На самом деле я и так не работаю с EEPROM. У меня есть "дубль" в ОЗУ и я только присваивание делаю. То есть с этой точки зрения всё Ok, но работа раскинута по всему проекту, нет защиты и т.д.
Выводы я сделал для себя, и не буду рекомендовать их для посторонних разработчиков. Но а для себя, звучит так: в связи с увеличением разнообразия камней, ростом их производительности, увеличением скорости разработки - использовать более системный подход к написанию ПО. То есть переносить опыт написания ПО для больших систем, на embedded платформы. Это ведёт к потере производительности, но увеличивает надёжность функционирования, упрощает перенос, ускоряет разработку.

*** Общие впечатления от камня LPC2106 и архитектуры ARM.
Я бы не назвал камень "чем то уникальным". Камень как камень, переферия как переферия. Где-то понравились особенности, где-то огорчили. Так, к примеру, наличие буфера фифо в USART, для моего проекта позволяет использовать любую скорость соединения. На AVR я могу получить максимальную скорость 57600. Зато переключение RS485 интерфейса получается просто "раком". Как они недодумали такую вещь - ума не приложу. Очень порадовал контроллер прерываний. Наличие FIQ прерывания, для меня, просто находка. Совершенно убила необходимость использования ноги SS в SPI при работе мастером. Просто потерянная нога. Ну и так далее. С одной стороны в каждом переферийном блоке были какие-то костыли. С каждым я бился, матерился и топал ногами. С другой стороны, всё это делается один раз, запоминается и далее идёт по накатанной.
Отладка проекта, в целом, оставила скорее положительные эмоции. Под MT-Link всё работало вполне устойчиво. Заливка производилась даже быстрее чем в AVR, что ускоряет процесс. Правда чуть медленнее компиляция производится и при включенной оптимизации много кода выпадает, но мне это ни грамма не мешало. Короче, с учётом того, что переферии у меня не много было задействовано, то переход потребовал не много времени. В целом я остался очень доволен. Есть ещё нюансы, например придётся написать новый бутлоадер, увязать всё, умощнить проект, распределить память и так далее, но всё это рабочие моменты. В целом я готовился к худшему. Отдельное спасибо разработчикам компилятора IAR. )))

Пытался кратко. Если что не понятно или какие вопросы - спрашивайте.
Go to the top of the page
 
+Quote Post
viael
сообщение Jun 25 2009, 22:48
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 200
Регистрация: 10-04-06
Из: Украина,Запорожье
Пользователь №: 15 979



А че LPC2106, давно в моде LPC23/24xx?
Go to the top of the page
 
+Quote Post
bodja74
сообщение Jun 25 2009, 23:14
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984



Цитата(viael @ Jun 26 2009, 02:48) *
А че LPC2106, давно в моде LPC23/24xx?


Неее... Точнее AVR vs ARM №2 ... или №22 biggrin.gif
Щаа народ сбежится ,будет друг друга maniac.gif
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jun 26 2009, 01:24
Сообщение #4


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(SasaVitebsk @ Jun 26 2009, 00:47) *
Работа с внутренним EEPROM под AVR.

Большое спасибо за реальные цифры!
Также присоединяюсь к тому, что не надо привыкать к "рюшечкам" компиляторов для работы с EEPROM и FLASH - создавать если не с файлы произвольного доступа, то хотя бы какой-то минимально независимый уровень. Все равно ведь все данные можно описАть в виде typedef struct, а потом обращаться по смещению через offsetof().
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 26 2009, 03:38
Сообщение #5


Гуру
******

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



Цитата(SasaVitebsk @ Jun 26 2009, 00:47) *
*** Общие впечатления от камня LPC2106

Прежде всего надо помнить, что это просто САМЫЙ ПЕРВЫЙ чип в ARM линейке Philips/NXP все остальные уже были потом. Из уникальностей этого чипа 64K RAM при миимуме пинов. Абсолютно по всем другим параметам (включая цену) проигрывает по полной.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Rst7
сообщение Jun 26 2009, 03:49
Сообщение #6


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



У меня немого другие данные на кодере JPEG (считайте, чистая математика, никакой периферии). Грубо говоря, ARM быстрее AVR в 2 раза, не более. С оптимизацией там все в порядке в обеих инкарнациях.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 26 2009, 04:07
Сообщение #7


Гуру
******

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



Цитата(Rst7 @ Jun 26 2009, 06:49) *
ARM быстрее AVR в 2 раза, не более.

Что очень странно - при примерно, в четверо большей тактовой!!!
На моих "математиках" обычно "пару-тройку раз" только за счет 32bit и плюс дополнительно мегагерцы. Что-то подобное и у Aвтора. По размерам Flash "типовая" цифирь +15% к AVR.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Rst7
сообщение Jun 26 2009, 05:37
Сообщение #8


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата
Что очень странно - при примерно, в четверо большей тактовой!!!


Мой результат без мегагерц. Исключительно по тактам.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
xelax
сообщение Jun 26 2009, 06:19
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035



Странно, во всех проектах которые приходилось запускать и на arm и на avr причём как на iar так и на gcc у меня наблюдалась обратная картина по флэш. Проекты собранные для арма на 10-15% меньше чем для avr. Использую thumb и макс. оптимизацию по размеру.
А у автора наоборот получилось.

вот только что собрал один и тот же код (gcc -Os):
arm(thumb)
Цитата
''
text data bss dec hex filename
67154 92 788 68034 109c2 (TOTALS)
''


avr
Цитата
''
text data bss dec hex filename
79587 75 479 80141 1390d (TOTALS)
''
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 26 2009, 06:24
Сообщение #10


Гуру
******

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



Цитата(xelax @ Jun 26 2009, 09:19) *
Проекты собранные для арма на 10-15% меньше чем для avr. Использую thumb и макс. оптимизацию по размеру.

Только ARM Mode, и только скорость. Остальное не интересует в подавляющем большинстве случаев совсем.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
xelax
сообщение Jun 26 2009, 06:40
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035



Цитата(zltigo @ Jun 26 2009, 10:24) *
Только ARM Mode, и только скорость. Остальное не интересует в подавляющем большинстве случаев совсем.

Очень хорошо, что задачи у всех разные biggrin.gif Меня очень интересует минимальный размер кода и совсем не критична скорость.

Но у автора и в thumb всё равно получилось больше чем для avr.
Вообще такие сравнения можно считать корректными при относительной одинаковсти настроек компилятора.
Go to the top of the page
 
+Quote Post
sensor_ua
сообщение Jun 26 2009, 07:25
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387



Цитата
Использую thumb

Thumb у многих LPC2xxx в разряде неотлечиваемых багов. Хотя мне, например, ещё ни разу не понадобилось ужиматься


--------------------
aka Vit
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 26 2009, 07:27
Сообщение #13


Гуру
******

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



Цитата(sensor_ua @ Jun 26 2009, 10:25) *
Thumb у многих LPC2xxx в разряде неотлечиваемых багов.

Зачем распространять небылицы sad.gif


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
777777
сообщение Jun 26 2009, 07:31
Сообщение #14


Профессионал
*****

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Цитата(SasaVitebsk @ Jun 26 2009, 01:47) *
Пытался кратко. Если что не понятно или какие вопросы - спрашивайте.

А какие частоты у процев?
Go to the top of the page
 
+Quote Post
VslavX
сообщение Jun 26 2009, 07:37
Сообщение #15


embarrassed systems engineer
*****

Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038



Цитата(Rst7 @ Jun 26 2009, 06:49) *
У меня немого другие данные на кодере JPEG (считайте, чистая математика, никакой периферии). Грубо говоря, ARM быстрее AVR в 2 раза, не более. С оптимизацией там все в порядке в обеих инкарнациях.

Математика бывает разной - у меня на 512-битной ЭЦП (Эль-Гамаль и эллиптика) LPC23xx@72MHz быстрее Mega@16MHz более чем в 30 раз.
Это как раз тот случай когда повышение разрядности 8->32 используется на 101%.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 07:25
Рейтинг@Mail.ru


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