Различия в компиляторах ARM Cortex-M

Я собираюсь разработать некоторые прошивки для ядер Cortex-M на процессорах STM32, использующих C для моих проектов, и поиск в Интернете. Я нашел много разных компиляторов: Keil, IAR, Linaro, Yagarto и Инструменты GNU для встроенных процессоров ARM.

Мне было интересно, какие функциональные различия существуют между этими компиляторами, которые могут повлиять на мой выбор? Например, в качестве энтузиаста мне не нужна поддержка или помощь от поставщика, и ограничение на размер кода в настоящий момент в порядке. Кроме того, простота использования не является главной проблемой, так как мне нравится учиться (и на данный момент у меня есть и Keil Lite и Eclipse с настройкой и работой GNU ARM).

Является ли сгенерированный код настолько различным с точки зрения размера/скорости между этими компиляторами? Есть ли таблица сравнения? (Я нашел в Интернете только устаревшие сведения)

Ответ 1

бенчмаркинг - это сама художественная форма, обычно легко манипулировать результатами, чтобы показать все, что вы хотите. Я бы не ожидал, что компиляторы будут генерировать одни и те же результаты, за исключением очень маленьких тестовых примеров, а иногда и в тех небольших тестовых случаях их результаты либо идентичны, либо иногда значительно отличаются от того, как ваш тест выявил оптимизацию, которую один компилятор знает/использует, а другой другой не делает.

Я обычно отслеживал такие вещи (числа производительности компилятора) с помощью dhrystone, но в случае известных тестов (не то, что dhrystone означает много больше, но других), вы можете обнаружить, что некоторые компиляторы настраиваются на просмотр хорошо под ориентирами, возможно, за счет чего-то другого.

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

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

Cortex-ms разделяются на группы armv6m и armv7m, v6m (cortex-m0) имеет только небольшое количество расширений большого пальца2, у armv7m есть около 150 расширений thumbv2 для большого пальца, поэтому вам нужно знать, что ваши инструменты поддерживать и не использовать неправильные вещи на неправильном чипе. Тогда компиляторы, если они знают все это, могут и будут производить разные комбинации команд из того же исходного кода. Кроме того, в рамках одного и того же компилятора или семейства, использующего разные параметры командной строки, вы можете/получите значительно другой код. И затем, помимо этого, с помощью cortex-m4 с кешем, если у вас есть такая вещь, в зависимости от того, как код лежит в строках кэша, вы можете получить значительно отличающуюся производительность, поэтому бенчмаркинг - это исследовательский проект сам по себе для каждого блога C, который вы хотите проверить. Диапазон производительности внутри одного компилятора может затенять другой компилятор или перекрытие может быть достаточно, чтобы не иметь значения.

Если у вас есть доступ к инструментам, которые вы профессионально добавляете к себе, учась использовать конкурирующие инструменты и быть в состоянии идти на работу и/или в свою работу, выберите то, что вы видите в качестве правильного инструмента для работы или заходите в дом в Киле и иметь возможность работать сразу или дом гну и работать сразу. Если вы можете потерять работу, если вы только gnu, а работа - для дома в Киле.

Ответ 2

Мы сделали некоторые сравнения; IAR и Keil обычно превосходят GCC с настройками по умолчанию. Но с некоторыми флагами компилятора вы можете заставить GCC приблизиться к результату IAR и Keil.

Некоторые из компиляторов, о которых вы упоминаете, являются интегрированными средами разработки. Другие просто компиляторы. Некоторые люди предпочитают интегрированную среду с компилятором, редактором и отладчиком, красиво упакованным для вас. Другие предпочитают создавать собственную среду. Это вопрос вкуса.

В дополнение к Yagarto существует также "Code Sourcery" для GCC для ARM.

Ответ 3

Производительность не должна быть вашей первоочередной задачей, если только она не станет таковой в производственной среде. Причина в том, что, во-первых, большинство ARM-компиляторов достаточно хороши, и вы действительно используете GCC, Keil и IAR. Во-вторых, большинство микроконтроллеров ARM являются "невероятно быстрыми" и имеют "так много памяти" (они сравниваются с 8-битными MCU, такими как AVR/PIC, но также и со старыми ПК). Достойный процессор Cortex-M4 работает на частоте до 100 МГц и имеет 256 Кбайт вспышки. Опять же, для сравнения: больше памяти и 10-кратная тактовая частота, чем у оригинального Macintosh и т.д. Мы отправились на Луну с гораздо меньшими затратами ;-)

Теперь производительность самих инструментов, в частности IDE и отладчиков, сильно различаются. Например, популярный Eclipse написан на Java, он может быть немного медленным для медленных или испытывающих недостаток памяти компьютеров. Лучшее, что можно сделать, это установить GCC + Eclipse, а также демонстрации поставщиков и убедиться в этом самим.