Поиск по сайтуКорзина |
C компилятор ARMC компилятор CMC-ARM ~ основные характеристики Результаты тестов C компиляторов ARM Особенности программирования на C для микроконтроллеров ARM Какой C компилятор ARM выбрать C компилятор CMC-ARM
Сравнение качества кода некоторых C компиляторовНиже представлены результаты тестирования следующих C компиляторов:
Сравнение для режимов ARM и Thumb проводилось на наборе исходных файлов, включающем: Сравнение для Cortex-M3 проводилось на демонстрационном проекте STM32_Demo (STMicroelectronics), включающем 48 исходных файлов. Все C компиляторы тестировались в режиме максимальной оптимизации по размеру кода.
Особенности программирования на C для микроконтроллеров ARMФактически язык C является стандартным языком программирования встроенных систем, и компилятор C является составной частью любой интегрированной среды разработки. Поэтому мы рассмотрим некоторые особенности реализации языка C для целевой платформы ARM и сравним несколько компиляторных пакетов, входящих в состав популярных средств разработки для встроенных систем, в том числе:
Практически все компиляторы для целевой платформы ARM удовлетворяют стандарту ATPCS Ядро 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. Принимая во внимание особенности конвенции вызовов и распределения регистров, можно сформулировать следующие простые правила оптимизации размера кода: если количество скалярных параметров функции не превышает 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 имеет такую особенность: если битовое поле не выходит за пределы одного байта, для операций с этим битовым полем всегда используются «оптимальные» байтовые инструкции По стандарту языка C битовые поля имеют тип int. При этом выравнивание ячейки памяти, в котором поле находится, и обращение к битовому полю определяется типом. Если битовое поле описано как short, то и для обращения к нему компилятор всегда будет использовать соответствующие инструкции чтения и записи полуслова; Более подробно этот механизм описан в документации на компиляторы. Представление памяти микроконтроллера Существенным моментом, связанным даже не с C компилятором, а с компоновщиком и средой разработки, является представление карты памяти микроконтроллера (ROM/Flash, RAM, отображаемые в память регистры периферийных устройств, векторы прерываний) программными средствами и механизм управления размещением кода и данных в физической памяти. Как правило, распределение памяти для МК одного производителя сохраняется от одного семейства МК к другому: размеры физической памяти изменяются, но стартовые адреса для памяти одного и того же типа остаются неизменными. Микроконтроллеры разных фирм с архитектурой 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 различных производителей. Однако использование свободно распространяемых средств – это всегда лотерея. Они, как правило, слабо документированы и имеют «под водные камни», некоторые из которых были упомянуты выше. Для всех коммерческих компиляторных пакетов, которые мы рассмотрели, существуют демоверсии. Для принятия окончательного решения следует провести анализ средств отладки. 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/ . |