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

Перенос проекта с AVR на ARM7. Информация к размышлению.

*** Побудительные мотивы написания.

Часто возникает вопрос выбора камня. Мы видим кучу таких постов. Некоторых это раздражает. Но на самом деле, для меня, причины этого очевидны. Давайте порассуждаем. Провести сравнительные исследования пары камней для текущего проекта - невозможно. Во-первых потому, что для этого надо сделать этот проект на двух платформах полностью, а потом провести исследования. Это, как мы понимаем увеличит затраты времени и денег почти в 2 раза. Кто на это пойдёт? Ориентироваться на сторонние оценки (статьи) - тоже сложно. Поскольку исследования стоят дорого, то бесплатно их никто не делает. Соответственно они проплачены. Как правило одним из производителей. Соответственно они достаточно тенденциозны. То есть, как правило,

идёт выпячивание достоинств и замалчивание недостатков у "нужных" камней, ну а у конкурентов - наоборот. Поэтому живое общение с кучей мнений, намного интересней. Особенно если приведены сравнительные данные.

Мне как раз пришлось переносить один проект с ATMega640 на LPC2106. Плюс особенность проекта такова, что есть возможность дать чёткую оценку производительности на данном проекте. С точки зрения аппаратной части - это почти сопоставимые проекты. То есть платка контроллера на 640 работает в том же железе что и 2106 и, при тестировании выполняют ту же задачу. Есть некоторое различие в выводе. Так, на 640 я использую 2 аппаратных канала SPI, а на 2106 один формирую програмно. На 640 я использую 8 ног камня напрямую, а в 2106 ч/з сдвиговый регистр и тоже программно. С одной стороны это несколько ухудшает точность сравнения, а с другой стороны более полно отражает свойства камня. Нет второго SPI - всё равно придётся пользовать

совтовый, не хватает мощности на выходе - приходится применять аппаратные средства с соответствующей программной обработкой. :) Короче точное сопоставление, но для этого проекта.

Я буду описывать два этапа. На первом этапе я перенёс проект "как есть". При том, что он был "вылизан" под 8-ми битовую архитектуру, обработка, во многих местах выполнялась таблично, для ускорения. Много работы с указателями, оптимизированной под 8-ми битную архитектуру. Некоторые важные части "оптимизированы" под AVR. В тоже время всё было написано на IAR C. На втором этапе, я переоптимизирую на работу с 32-ух битной архитектурой.

 

 

*** Производительность. Тестовое сравнение.

1-ый этап. Сопоставление по объёму флэш памяти. Некоторые примечания. От проекта требуется только производительность. Соответственно выбиралась настройка максимальной оптимизации по скорости. Проект и там и там влазит с запасом. Необходимо учесть, что порядка 1.5к на ARM "потерялось" в таблицах при выравнивании (это учтено в данных ч/з "/"). Надо понимать, что если бы ставилась задача оптимизации по размеру, то эту потерю я мог бы легко устранить. Но, поскольку,флэши у меня вагон, то я просто не буду этого делать. Соответственно, сравнение по флэши - чисто оценочное, для реального проекта, для любознательных. Кроме того, проект я пишу в режиме ARM, по вышеперечисленным причинам. В таблице приведены результаты компиляции

проекта так же в режиме THUMB, но это чисто для информации. Полного тестирования проекта в этом режиме не осуществлялось. Ну и кроме того, надо учесть, что в данном проекте около половины занимают таблицы.

:)

-----------------------------------------------------------------
Камень                  ! 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. :)

Загрузка при уровне оптимизации "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. )))

 

Пытался кратко. Если что не понятно или какие вопросы - спрашивайте.

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


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

А че LPC2106, давно в моде LPC23/24xx?

 

Неее... Точнее AVR vs ARM №2 ... или №22 :biggrin:

Щаа народ сбежится ,будет друг друга :maniac:

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


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

Работа с внутренним EEPROM под AVR.

Большое спасибо за реальные цифры!

Также присоединяюсь к тому, что не надо привыкать к "рюшечкам" компиляторов для работы с EEPROM и FLASH - создавать если не с файлы произвольного доступа, то хотя бы какой-то минимально независимый уровень. Все равно ведь все данные можно описАть в виде typedef struct, а потом обращаться по смещению через offsetof().

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


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

*** Общие впечатления от камня LPC2106

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

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


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

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

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


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

ARM быстрее AVR в 2 раза, не более.

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

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

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


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

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

 

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

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


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

Странно, во всех проектах которые приходилось запускать и на 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)

''

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


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

Проекты собранные для арма на 10-15% меньше чем для avr. Использую thumb и макс. оптимизацию по размеру.

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

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


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

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

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

 

Но у автора и в thumb всё равно получилось больше чем для avr.

Вообще такие сравнения можно считать корректными при относительной одинаковсти настроек компилятора.

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


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

Использую thumb

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

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


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

Thumb у многих LPC2xxx в разряде неотлечиваемых багов.

Зачем распространять небылицы :(

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


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

Пытался кратко. Если что не понятно или какие вопросы - спрашивайте.

А какие частоты у процев?

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


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

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

Математика бывает разной - у меня на 512-битной ЭЦП (Эль-Гамаль и эллиптика) LPC23xx@72MHz быстрее Mega@16MHz более чем в 30 раз.

Это как раз тот случай когда повышение разрядности 8->32 используется на 101%.

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


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

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

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

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

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

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

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

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

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

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