Ок!Закрыть
Содержимое
Корзина

Корзина пуста!


C компилятор ARM

CMC-ARM  C компилятор для микроконтроллеров ARM и Cortex разработан фирмой Фитон.

  • C компилятор удовлетворяет требованиям стандарта ANSI/ISO 9899-1990;
  • Включает в комплект поставки заголовочные файлы с описаниями регистров специального назначения (SFR) наиболее популярных микроконтроллеров ARM и Cortex;
  • Включает библиотеки для режимов ARM и Thumb;
  • Поддерживает использование функций ARM и Thumb в одном файле исходного текста;
  • Обеспечивает эффективную поддержку переключения режимов ARM/Thumb;
  • Поддерживает режим встроенного ассемблера и специфические функции архитектуры ARM (функции прерывания, форматы регистров SFR, битовые операции);
  • Поддерживает стандарт арифметики с плавающей точкой IEEE-754 для операций с двойной и одинарной точностью;
  • Поддерживает генерацию кода для векторного сопроцессора с плавающей точкой (VFP);
  • Формирует расширенную символьную информацию для поддержки отладки по исходному тексту.

C компилятор CMC-ARM ~ основные характеристики

Результаты тестов C компиляторов ARM

Особенности программирования на C для микроконтроллеров ARM

Какой C компилятор ARM выбрать

Литература

  

C компилятор CMC-ARM

  1. Обеспечивает реализацию языка С:
    •    Полное соответствие стандарту ANSI/ISO 9899-1990
    •    Некоторые расширения ISO 9899-1999, в частности:
      1. строчные комментарии в стиле С++
      2. макросы с переменным числом параметров
      3. синтаксис перечислений (enumerations) и списков инициализаторов
    •    Расширения, удобные при разработке ПО встраиваемых систем:
      1. бинарные константы
      2. автоматический вызов специальных функций в прологе/эпилоге
      3. размещение переменных по абсолютным адресам
      4. управление инициализацией статических переменных
    •    Платформо-зависимые расширения для реализации:
      1. обработчиков прерываний
      2. мониторных функций  
    •    Набор встроенных функций для доступа к ресурсам процессора и генерации специальных инструкций
    •    Встроенный ассемблер
  2. Поддерживает архитектуры:
    1. ARM-7
    2. ARM-9
    3. Cortex-M3
    4. Cortex-M1
    5. Cortex-M0
  3. Поддерживает режимы ARM, Thumb, Thumb-2:
    • Эффективная поддержка переключения режимов ARM/Thumb
    • Возможность использования функций ARM и Thumb в одном файле исходного текста
    • Библиотеки для всех режимов, включая interworking
  4. Оптимизирует генерируемый код:
    • Эффективное распределение локальных и временных переменных
    • Оптимизация высокоуровневого промежуточного представления
    • Платформо-зависимые низкоуровневые оптимизации
  5. Имеет набор библиотек:
    • Полная стандартная библиотека (free-standing implementation)
    • Арифметика с плавающей точкой (стандарт IEEE-754) для операций с двойной и одинарной точностью
    • Заголовочные файлы с описаниями регистров специального назначения (SFR) наиболее популярных микроконтроллеров Миландр, Philips/NXP LPC2000, Atmel SAM7x, STMicroelectronics ST7xx, OKI ML67Qx и др.
  6. Генерирует расширенную символьную информацию для отладки по исходному тексту
  7. Содержит документацию C компилятора на русском языке
  8. Обеспечивает совместимость и поддержку стандартов:
    • EABI (опциональная)
      1. Размещение и выравнивание данных базовых и агрегатных типов
      2. Соглашение по использованию регистров и стека
      3. Конвенция вызовов
      4. Операции с volatile объектами
    • Опционально – генерация формата elf
    • CMSIS
    • Частичная поддержка нестандартных расширений языка, используемых распространенными C компиляторами

      Сравнение качества кода некоторых C компиляторов

    Ниже представлены результаты тестирования следующих C компиляторов:

  • IAR V5.41.2.21793 (IAR)
  • Raisonance Ride7 v7.22.09.0203 GCC v4.3.2 (GCC)
  • CMC-ARM (Фитон)

    Сравнение для режимов ARM и Thumb проводилось на наборе исходных файлов, включающем:

    1. тесты из набора Raisonance Benchmark;
    2. стандартные dhrystone и whetstone.

    Сравнение для Cortex-M3 проводилось на демонстрационном проекте STM32_Demo (STMicroelectronics), включающем 48 исходных файлов. Все C компиляторы тестировались в режиме максимальной оптимизации по размеру кода.

    C компиляторы ARM, сравнительные характеристики - режим ARM

    C компиляторы ARM, сравнительные характеристики - режим Thumb

    C компиляторы ARM, сравнительные характеристики - режим Thumb-2

    Особенности программирования на C для микроконтроллеров ARM

    Фактически язык C является стандартным языком программирования встроенных систем, и компилятор C является составной частью любой интегрированной среды разработки. Поэтому мы рассмотрим некоторые особенности реализации языка C для целевой платформы ARM и сравним несколько компиляторных пакетов, входящих в состав популярных средств разработки для встроенных систем, в том числе:

  • IAR Embedded Workbench (IAR Systems);
  • Real View MDK (ARMKeil);
  • CM-ARM (российская фирма «Фитон»);
  • GNU – GCC, входит в состав среды разработки в качестве основного
  • (например, RIDE компании Raisonance, CrossWorks компании Rowley Associates и др.)
  • или дополнительного (MDK, CMARM) компиляторного пакета;
  • ICCV7 (Image Craft).

    Практически все компиляторы для целевой платформы ARM удовлетворяют стандарту ATPCS
    (ARM Thumb Procedure Call Standard), разработанному компанией – разработчиком ядра.
    В стандарте описаны требования к представлению основных типов данных, использованию стека и
    конвенция вызова функций.

    Ядро ARM использует классическую архитектуру load/store, т.е. в качестве операндов могут использоваться только значения, загруженные в 32разрядные регистры процессора. Поэтому хотя в системе команд представлены операции чтения из памяти и записи в память со всеми целочисленными типами данных, в том числе со знаковым и без знаковым расширением, при операциях с 8 и 16разрядными локальными переменными (char или short), необходимость преобразования типов может приводить к
    заметному увеличению размера кода. Например, для функции:

    short f(short a)

    {

    if (a > 1)

    /* некоторый код */

    }

    будет сгенерирован следующий код:

    MOV R1,R0,LSL #16  ;помещаем знаковый бит в старший разряд

    MOV R1,R1,ASR #16 ; знаковое расширение

    CMP R1,#1

    А для функции

    int f(int a)

    {

    if (a > 1)

    /* некоторый код */

    }

    соответствующий код будет состоять из одной инструкции

    CMP R1,#1

    Поэтому в отличие от 8разрядных архитектур, рекомендуется по возможности использовать тип int для параметров и локальных переменных, которые размещаются в регистрах.

    Конвенция вызовов

    Распределение регистров в соответствии со стандартом ATPCS приведено в таблице 2.
    Как следует из таблицы, одновременно функция может содержать не более 14 локальных регистровых  переменных, включая параметры (R0R11, R12 и R14). Остальные локальные переменные размещаются в памяти (стеке). Доступ к размещённым в памяти данным является более затратной операцией, и по возможности его следует избегать.

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

    если количество скалярных параметров функции не превышает 4, они будут передаваться через егистры;

    если необходимо передать в функцию более четырёх параметров, следует запаковать их в структуру и на неё передавать указатель;

    не следует использовать более десяти локальных переменных одновременно (при условии, что у функции четыре параметра);

    следует избегать функций с переменным числом параметров.

    Влияние выравнивания на размещение структур в памяти

    Из-за выравнивания занимаемый структурой размер зависит от порядка, в котором члены структуры разных типов входят в состав структуры, например:

    struct {char c; short s; char d; int i;}

    будет занимать в памяти 12 байт:

    |c|_|s|s|d|_|_|_|i|i|i|i| |1|2|3|4|5|6|7|8|9|A|B|C|

    Та же самая структура, объявленная как

    struct {char c; char d; short s; int i;}

    будет занимать 8 байт, поскольку при таком размещении не требуется дополнительных байтов для выравнивания внутри структуры.

    Битовые поля

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

    Так, C компилятор ARM  - GCC имеет такую особенность: если битовое поле не выходит за пределы одного байта, для операций с этим битовым полем всегда используются «оптимальные» байтовые инструкции
    чтения и записи, что может приводить к Data Abort при обращении к регистрам периферии размером в 4байтное слово.

    По стандарту языка C битовые поля имеют тип int.
    Такие C компиляторы ARM, как IAR, RVCT, CMARM поддерживают расширение языка C, позволяющее описывать битовые поля любым базовым целочисленным типом.

    При этом выравнивание ячейки памяти, в котором поле находится, и обращение к битовому полю определяется типом. Если битовое поле описано как short, то и для обращения к нему компилятор всегда будет использовать соответствующие инструкции чтения и записи полуслова;
    если оно описано как int – компилятор C будет использовать только инструкции чтения и записи слова.

    Более подробно этот механизм описан в документации на компиляторы.

    Представление памяти микроконтроллера

    Существенным моментом, связанным даже не с C компилятором, а с компоновщиком и средой разработки, является представление карты памяти микроконтроллера (ROM/Flash, RAM, отображаемые в память регистры периферийных устройств, векторы прерываний) программными средствами и механизм управления размещением кода и данных в физической памяти.

    Как правило, распределение памяти для МК одного производителя сохраняется от одного семейства МК к другому: размеры физической памяти изменяются, но стартовые адреса для памяти одного и того же типа остаются неизменными. Микроконтроллеры разных фирм с архитектурой ARM, даже с одинаковыми
    ядрами ARM, значительно отличаются друг от друга. Поэтому на практике могут оказаться существенными следующие особенности ПО: поддерживается ли МК конкретного производителя средой разработки, насколько наглядно и просто можно модифицировать распределение памяти, насколько гибко компилятор и компоновщик могут управлять размещением сегментов с кодом и данными.

    Например, для компоновщика GNU конфигурация ld и размещение сегментов (секций) в памяти  задаётся с помощью довольно сложного языка сценария и не обладает достаточной гибкостью.

    Маленькие хитрости

    Следует иметь в виду, что в системе команд ARM/Thumb есть инструкции знакового и без знакового умножения, но отсутствуют инструкции деления (оно реализуется программно). Поэтому рекомендуется вместо операций деления использовать операции сдвига.При разработке систем реально го времени следует принимать во внимание, что инструкции ARM являются «атомарными», т.е. исполнение инструкции не может быть прервано обработчиком прерывания.

    Если в одной инструкции осуществляется запись в большое число регистров, использование инструкций чтения и записи группы регистров может существенно увеличивать время реакции на возникновение прерывания. Эти инструкции обычно генерируются компилятором в прологе и эпилоге функций с целью сохранения и восстановления регистров, используемых для размещения локальных переменных функции (за исключением регистров R0R3 и R12, которые являются scratch регистрами).Во избежание таких задержек следует сокращать количество локальных переменных в функции (тогда почти все они могут быть размещены в scratch регистрах).

    Кроме того, некоторые компиляторы имеют специальное средство, позволяющее ограничить число сохраняемых/восстанавливаемых регистров.

    Какой C компилятор выбрать

    Внедрение процессорного ядра ARM в 32 разрядные микроконтроллеры (МК) для встраиваемых систем и фактическое превращение архитектуры ARM в промышленный стандарт привели к тому, что аппаратные и программные средства разработки для этих МК предлагают практически все фирмы, выпускающие подобные продукты.Доступность и качество средств разработки и отладки являются важным фактором при принятия решения о переходе на новую платформу, поэтому рассмотрим их более подробно.

     Для процессоров ARM в настоящей момент существует множество программных средств разработки (компиляторов, отладчиков, интегрированных сред программирования), от свободно распространяемого программного обеспечения (проект GNU) до интегрированных пакетов, предлагаемых крупнейшими мировыми компаниями – производителями средств разработки для встроенных систем, такими как IAR Systems или ARM.При обсуждении средств разработки ПО для встраиваемых приложений мы будем ориентироваться на задачи, выполняемые в реальном времени без применения операционных систем, что соответствует типичному использованию 8 разрядных микроконтроллеров.

    IAR EWARM 4.41A компании IAR Systems.

    Продуманная оболочка с хорошими возможностями разработки и отладки, имеет единый интерфейс для различных семейств микропроцессоров. Среда работает только с собственным C компилятором IAR, подробно и качественно документирована, содержит много примеров.

    Keil mVision3 компании Keil.

    Входит в состав KeilARM Real View MDK. Простая в освоении оболочка, хорошо известная разработчикам систем на основе целевой архитектуры MCS51. В состав пакета входит свежая версия C компилятора от компании ARM RVCT

    3.0 (Real View Compilation Tools), но среда также предусматривает интеграцию с собственным компилятором от Keil, с компилятором GNU для ARM (gcc) и с более ранней версией компиляторного пакета от ARM, ADS (ARM Development Suite).

    Имеются некоторые трудности при установке на один компьютер нескольких пакетов mVision для разных семейств микроконтроллеров.

    CM-ARM. Среда разработки компании «Фитон».

    Работает с собственным C компилятором CMC-ARM и с C компилятором GCC; Предусмотрена возможность интеграции с C компилятором IAR. Простая в освоении, хорошо оснащённая оболочка, имеющая русский интерфейс.

    Визуализированная настройка распределения памяти: можно задать неограниченное число областей памяти ROM/RAM/Flash и управлять размещением сегментов.

    Кроме того, CM-ARM может использоваться самостоятельно в качестве отладчика.

    ImageCraft.

    Среда работает с собственным C компилятором и, в отличие от остальных, не содержит встроенного симулятора отладчика.

    Кроме того, демоверсия C компилятора плохо документирована и не поддерживает генерацию кода в режиме Thumb.

    И, наконец, если вы предпочитаете сэкономить на компиляторе и прочих программных средствах разработки, – используйте проект GNU: в Сети можно найти достаточно компактные библиотеки для встроенных систем на основе микроконтроллеров ARM различных производителей.

    Однако использование свободно распространяемых средств – это всегда лотерея. Они, как правило, слабо документированы и имеют «под водные камни», некоторые из которых были упомянуты выше.

    Для всех коммерческих компиляторных пакетов, которые мы рассмотрели, существуют демоверсии.
    Дистрибутив пакета GCC имеется как в исходных кодах, так и в бинарном виде. Практически все демоверсии снабжены многочисленными приме рами для микроконтроллеров ARM различных производителей, что позволяет самостоятельно оценить удобство работы с конкретным пакетом и выбрать тот, который подходит именно вам.

    Для принятия окончательного решения следует провести анализ средств отладки.

    Литература

    1. Polastre J., Szewczyk R., Culler D. Computer Science Department. Univ. of California,

    2. Berkeley. Berkeley, CA 94720. http://www.moteiv.com/products/docs/ an002telos.pdf.

    3. Староверов К.С. Сравнительный анализ микроконтроллеров с ядром ARM. star@set micro.com.

    4. Wilbrink J. Facilitation the Migration from 8bit to 32bit Microcontrollers. ECE, February, 2005.

    5. http://www.arm.com , http://www.nxp.com , http://www.atmel.com , http://mcu.st.com , http://www.analog.com , http://www.ti.com , http://www2.okisemi.com .

    6. Procedure Call Standard for the ARM Architecture, www.arm.com/miscPDFs/ 8031.pdf.

    7. IAR Systems, www.iar.se .

    8. RealView MDK, www.keil.com/arm .

    9. Компания Фитон, www.phyton.ru.

    10. CrossWorks for ARM, www.rowley.co.uk/arm/ .

    11. Image Craft, http://www.imagecraft.com/ .