С. Емец, М. Еременко Компиляторы Си для микроконтроллеров PIC18. Часть 2Знакомство с компиляторами Перед установкой можно ознакомиться с так называемыми "баг-листами" - списком обнаруженных и устран╦нных ошибок компилятора. Как правило, все производители сопровождают новую версию компилятора таким списком. По нему видно состояние программы и перспективы е╦ развития. MICROCHIP MPLAB C18: ошибок много и в компиляторе, и в препроцессоре, и исправление многих достаточно критических ошибок занимает долгое время (если проследить историю развития). Использовать этот компилятор в большом проекте следует с осторожностью. Плохо работал компилятор MPLAB C для PIC16 и доверие к программной продукции Microchip было подорвано. Но следует отметить, что компилятор для PIC18 существенно переделан и имеет новый кодогенератор, отличный от MPLAB C. HI-TECH PICC-18 COMPILER: очень хорошо зарекомендовал себя компилятор производства HI-TECH для PIC16, поэтому можно предположить, что для PIC18 будет не хуже. Так как отличия от стандарта ANSI в компиляторах HT-SOFT одинаковые, следует ожидать, что программы для PIC16 могут быть перенесены на PIC18 без значительных исправлений. Список ошибок (bugfixes.txt) в директории установки показывает, что ошибки устраняются, а отклонения от стандарта и ограничения не являются критическими. Есть версия, работающая в Linux. CCS C: список ошибок найти не удалось, но какое-то представление об ограничениях может дать список сравнения компиляторов, привед╦нных на сайте CCS: http://www.ccsinfo.com/compare.html. Следует отметить, что в CCS C отсутствует отдельный ассемблер, линковщик. И единственным очевидным способом использования ассемблера в CCS C проекте мне кажется использование директив #asm/#endasm. IAR C/EC++ Compiler for Microchip PIC18: данный компилятор не только С, но и урезанный вариант С++ (Embed-ded C++). По нашему мнению, предлагаемый вариант (диалект) С++ позволяет пользоваться более удобным С++ синтаксисом и использовать принципы ООП для разработки приложений для PIC18. В "баг-листе" сообщается, что обнаруженные и неисправленные ошибки отсутствуют. Следующим важным элементом среды разработки С является наличие библиотек. Желательно иметь (как минимум) LIBC и MATH. Если эти библиотеки отсутствуют или реализованы частично, то такую среду нельзя рассматривать как полнофункциональную, и компилятор не является стандартным. Исходники библиотек существуют в свободном виде, и для нормального компилятора не должно вызывать проблемы собрать библиотеку и, если проект компилятора имеет серь╦зное развитие и поддержку, то написать свою версию библиотеки является следующим шагом, после того как компилятор (генератор кода) заработал. По этому критерию, у MPLAB C18 отсутствует часть библиотеки вычислений с плавающей точкой и стандартная библиотека libc реализована не полностью. Поэтому при использовании этого компилятора перенос каких-либо алгоритмических вещей или разработка алгоритма, использующего вычисления с плавающей точкой, может вызвать дополнительные трудности. Следует заметить, что присутствуют библиотеки работы с периферией, включая внешний CAN-контроллер MCP2510. Даются исходные коды большинства библиотек. В HT PICC18 реализована большая часть стандартных библиотек. То есть этот компилятор способен компилировать алгоритмы, использующие стандартные С-функции, с минимальными исправлениями. Для работы с периферийными устройствами в составе HITIDE предлагаются примеры. Список стандартных функций, реализованных в ССS С, уступает HT-PICC. Имеется большое количество примеров использования и библиотека работы с периферией (так называемые build-in функции). По-видимому эти функции реализованы не как библиотека, а как часть компилятора. Найти библиотеки в CCS C нам не удалось. Учитывая отсутствие линкера, вести разговор о библиотеках в CCS, наверное, вообще не имеет смысла. В IAR C/EC++ реализована не только libc и математическая библиотека, но и предлагается частичная реализация библиотеки С++. Это конечно не libstdc++ (вообще использование этой библиотеки в простых встраиваемых системах не оправдано), но некоторые полезные свойства в dlib имеются. Из всех рассматриваемых компиляторов в IAR наиболее полный комплект библиотечных функций. Следует заметить, что специальная поддержка периферийных устройств кристалла отсутствует, и только малая часть библиотеки представлена в исходном коде. Так как с использованием микроконтроллеров Microchip разрабатываются встраиваемые системы, то желательно иметь функциональные библиотеки обслуживания периферийных устройств: RS232, CAN, I2C и подобные, - но это является дополнительным свойством среды разработки. В состав MPLAB C18 входят библиотеки поддержки периферийных устройств кристаллов PIC18. Это да╦т возможность предположить, что если такая библиотека будет работоспособна, то поможет сохранить время при разработке приложения, использующее стандартный протокол. Так как все предлагаемые библиотеки для работы с периферией доступны в виде исходников, то можно будет перенести эти библиотеки под другой компилятор. В CCS C есть набор функций, который позволяет работать с некоторыми периферийными устройствами. В HT-PICC поддержка периферийных устройств отсутствует, зато в HITIDE есть code snippets, которые могут рассматриваться как примеры для работы с периферийными устройствами. Так как в статье делается обзор компиляторов, то свойства остальных средств разработки (ассемблера, линкера и остальных утилит) не рассматриваются. Сравнения и тесты Провед╦м несколько тестов с компиляторами MPLAB C18, IAR PIC18, HT PIC18 и ССS С, оценим их работу и возможности и проверим, насколько верны наши предположения по использованию архитектуры PIC18. Данная статья не претендует на объективное сравнение характеристик различных компиляторов и остальных средств разработки, входящих в состав соответствующих программных пакетов. Предлагаемые для теста примеры являются либо фрагментами реальных проектов, либо специально предназначены для тестирования определ╦нных свойств компиляторов. Полученные результаты по скорости выполнения и размеру исполняемого модуля могут быть улучшены за сч╦т изменения опций оптимизации и переписывания исходного кода. Потребуются практиче-ские эксперименты, так как рассмотрение фирменной документации и таблиц сравнения компиляторов (которые у разных производителей показывают совершенно разный результат) вряд ли является достаточным основанием для выбора средства разработки. Прежде чем приступить к рассмотрению примеров на С, несколько слов об интеграции программных средств в MPLAB. Для того, чтобы подключить в среду MPLAB компилятор стороннего производителя (подробные инструкции в файле http://www.microchip.com/download/tools/picmicro/code/third/51234a.pdf на сайте или CD-ROM), следует в Project->Install Language Tool указать пути к исполняемым файлам лин-кера, компилятора, ассемблера. Для средств HI-TECH следует указывать во всех случаях picc18.exe (эта программа определяет по типу файла, какое средство следует вызвать). А для сборки проекта, состоящего из нескольких файлов в Project->Edit Project->Node Properties┘ Language Tool, следует указывать линковщик, а потом с помощью кнопки Add Node подключать исходные файлы на С или ассемблере с соответствующим средством и опциями. После выхода среды HITIDE компилятор HT-PICC18 лучше использовать с этой средой. Для MPLAB C18 требуется включать скрипт линкера, соответствующий выбранному кристаллу (*.lkr), в список узлов (Add Node) проекта и указать пути к библиотекам, h-файлам и скриптам линкера. Также следует помнить, что в составе MPLAB C18 используется другой линковщик (не тот, который входит в MPLAB 5.хх), поэтому следует указать его. Подключать IAR C компилятор к среде MPLAB не потребуется, так как можно воспользоваться средой IAR, включающей в себя симулятор C-SPY. Среда CCS во время установки прописывает данные в инициализационный файл MPLAB, и проблем с созданием ССS С проектов для MPLAB не возникает. Во всех предлагаемых тестах возвращаемый результат будет иметь значение char и для того, чтобы посмотреть его в симуляторе MPLAB, значение выводится в порт, и его можно увидеть в списке SFR. Для проверки правильности вычисляемых значений на ПК вывод в порт следует заменить выдачей на печать (printf). Так как в тестируемых компиляторах подключаемый файл с описанием кристалла имеет разное имя, то в тексте примеров я не буду приводить директиву #include <>. Для компиляции следует дополнить приводимый текст:
для CCS C также следует заменить строку PORTB=.. на output_b(┘). Первым провед╦м тест на компиляцию рекуррентного вызова:
При попытке скомпилировать данный пример компиляторами CCS и HT-SOFT, получается сообщение об ошибке и прекращение работы. Конечно то, что CCS C и HT-SOFT C не поддерживают рекуррентных вызовов, написано в документации, но лучше один раз увидеть чем сто раз услышать :). Следовательно, эти компиляторы не используют всех возможностей PIC18 и являются улучшенны-ми версиями старых компиляторов для PIC16. В то же время, компиляторы IAR и MPLAB-C18 компилируют данный пример, и исполняемая программа выводит в порт правильный результат (120). Для компиляции следует выбрать хранение переменных на стеке (а не оверлей). Внутренняя структура кода, генерируемая компиляторами IAR и MPLAB-C18, соответствует по своей организации структуре стандартного компилятора, что позволяет переносить готовые решения (например, стек TCP/IP, многозадачную ОС и так далее) на PIC18. Следующий пример направлен на способность работать со сложными типами данных.
При попытке скомпилировать этот пример, для HT-PICC18 получаем синтаксическую ошибку на нормальном С-выражении crls+=h_weight(db[t].buf_h^cof[t])-16; Таким образом, HT-PICC18 имеет ошибки в разборщике синтаксиса (в то время как компилятор этой же фирмы для PIC16 принимает это выражение). Все остальные компиляторы генерируют правильный код для данного примера. Также интересно провести количественные сравнения результатов работы компиляторов. То есть сравнить размер исполняемого файла (прошивки памяти) и скорость его исполнения (число тактов) для одинакового С-кода, скомпилированного и слинкованного с библиотекой разными компиляторами. Скорость исполнения измеряется количеством тактов, показанным симулятором, до точки останова, которая ставится в конце программы на оператор вывода в порт PORTB=┘ Для более интегрированного исследования сред программирования будут использоваться с HT-PICC18 - HITIDE, с MPLAB C18 ≈ MPLAB 6.xx, c CCS C - MPLAB 5.xx, а компилятор IAR - с "родной" средой. Замтим, что нам достаточно сложно было обнаружить, как ставятся точки останова в HITIDE: для этого следует в окне редактора дважды кликнуть любой кнопкой мыши на вертикальный столбик слева от номера строки. В качестве размера исполняемого кода приводятся данные, полученные при компиляции примеров в различных средах. При этом используется результат в словах, который был показан средством, а не байтовый размер исполняемого файла. Следует учесть, что отч╦т об используемой памяти IAR предоставляет в байтах, а остальные среды - в словах. Поэтому привед╦нные значения для IAR C/EC++ получены умножением на 2 результата, показанного в отч╦те. Немаловажными параметрами, влияющими на размер кода и скорость его исполнения, являются параметры оптимизации. Но в тех примерах, где основной объ╦м вычислений выполняется библиотечными функциями, оптимизация С-кода не играет важной роли. Для проверки и сравнения качества кода, генерируемого компилятором, в примерах выставлялся максимальный уровень и включались все дополнительные опции. При этом следует отметить, что в ССS С какие-либо опции отсутствуют, HT-PICC имеет параметр глобальной оптимизации и ассемблерную/локальную оптимизацию, MPLAB C18 и IAR имеют набор параметров, включающих определ╦нный тип оптимизации (branch opti-mization, common subexpresion optimi-zation и т.п.), и также имеют различные методы представления локальных переменных. То есть управление оптимизацией в IAR ICCPIC18 и MPLAB-C18 является наиболее сложным, но позволяет добиться более качественного кода. Прежде чем переходить к сравнению компиляторов между собой, рассмотрим влияние оптимизации в MPLAB-C18 и IAR ICCPIC18. IAR C имеет следующие параметры - оптимизация по скорости или размеру и возможности "высокоуровневой" оптимизации. Common-subexpr elimina-tion - выносит за тело цикла вычисления, результат которых не меняется при итерациях, function inlining - включение кода вызываемой функции в код вызывающей (может привести к увеличению размера, но гарантирует выигрыш по скорости), code moution - да╦т компилятору возможность изменять порядок исполнения операторов (при работе с портами по фиксированной временной диаграмме может вызвать ошибки), loop unrolling - оптимизация циклов (приводит к увеличению скорости исполнения за сч╦т увеличения размера кода). В табл. 2 приведено влияние опций оптимизации на размер кода для примера 2. Из таблицы видно, что наилучших результатов можно добиться при оптимизации по скорости с включенными опциями преобразования. Таблица 2. Размер исполняемого кода при различных опциях оптимизации a IAR ICCPIС18
Таблица 3. Размер исполняемого кода при различных опциях оптимизации в MPLAB C18
Большое значение имеет выбор представления локальных переменных: static overlay и stack. При использовании размещения static overlay получается экономия памяти данных, выигрыш по размеру кода и скорости исполнения, но при этом компилятор не обладает полной функциональностью - невозможно использовать С++ и требуется следить за вызовами функций (то есть возникает потенциальная ошибка при вызове функции из прерывания и основного кода). Также на размер кода и требуемой RAM влияет выбор библиотеки - при выборе более простой clib потребуется меньше ресурсов, но список поддерживаемых функций будет меньше и не ANSI, а также будет отсутствовать возможность использовать ЕС++. MPLAB C18 достаточно подробно описан в документах на сайте Micro-chip http://www.microchip.com/1010/pline/tools/picmicro/code/mplab18/index.htm. Работа оптимизатора и влияние различных ключей оптимизации на генерируемый код приведено в MPLAB╝ CXX User▓s and Reference Guide Ad-dendum (51255b.pdf). А рекомендации по написанию эффективного С-кода приведены в MPLAB╝ C18 Optimization Tips (optimize.pdf). По умолчанию, все оптимизации разрешены. Так же, как и в IAR, локальные переменные могут размещаться либо на стеке, либо статически с перекрытием (есть промежуточный вариант - статически без перекрытия). По умолчанию, переменные размещаются на стеке. Также есть дополнительные опции по использованию памяти быстрого доступа, размеру указателей и т.п. Как и в большинстве других компиляторов, полный список опций можно получить, запустив компилятор без параметров (mcc18.exe | more). Построим таблицу для компилятора MPLAB C18, используя small-модель с near-данными. Легко заметить, что MPLAB-C18 генерирует наилучший код при использовании статического размещения данных. Возможно, что использование статиче-ского размещения с перекрытием (static overlay) обеспечивает экономию памяти данных, но так как при таком размещении требуются указатели большей разрядности (far), то получаемый код имеет больший размер. Следует заметить, что с far-указателями код, генерируемый для статического размещения, имеет такой же или чуть больший размер. Следующим примером проверим реализацию библиотеки libc. Следующий пример направлен на способность работать со сложными типами данных.
Так как в данном примере используется функции скомпилированной библиотеки, то опции оптимизации не важны. Также отметим, что пример не будет работать в MPLAB-C18 из-за неполной реализации библиотек. В остальных средствах функцию sprintf сконфигурируем на поддержку преобразований целочисленных значений. Результаты теста приведены в табл. 4. Таблица 4. Сравнение кода, генерируемого различными компиляторами при максимальной оптимизации. Знаменатель - размер a словах, числитель - количество тактов до обращения e PORTB (выдача результата)
Таблица 5. Сравнение эффективности N e ЕС++ компиляторов IAR. Знаменатель - размер a словах, числитель - количество тактов до обращения e PORTB (выдача результата)
Немаловажным плюсом языка С является встроенная поддержка вычислений с плавающей точкой. Следующим примером проверим эффективность реализации плавающей точки в компиляторах.
Из-за неполной математической библиотеки MPLAB-C18 не компилирует этот пример. В качестве заключительного теста возьм╦м пример, в котором отсутствуют сложные выражения и не требуются библиотеки. Этот пример может быть скомпилирован каждым из рассматриваемых компиляторов и результаты занесены в табл. 4.
В последнем сравнительном тесте сравним код, генерируемый IAR С компилятором и IAR EC++ компилятором. То есть попытаемся получить ответ на вопрос, насколько кодогенератор С++ уступает С. Для этого перепишем пример 5 на С++ и сравним с исходным примером.
Следует заметить, что в версии IAR EW 2.11А не работает символьная отладка EC++ (похоже, какая-то несовместимость форматов отладочной информации). Итоги Резюмируя провед╦нные исследования, можно рекомендовать применять тот или иной компилятор в следующих случаях. IAR C/EC++ - в случае работы с несколькими платформами и возможностью использования исходных С-файлов для компиляции на разные платформы. Также эффективен при реализации вычислений с плавающей точкой. Хороший результат проявляется при разработке сложных проектов за сч╦т высокоуровневой оптимизации. Отлично реализованы библиотеки. Для разработки небольших или чувствительных к ресурсам приложений не подходит. О коде, генерируемом С++-компилятором IAR, можно сказать, что проигрыш по эффективности С-коду незначителен (для сравнения требуется стековая модель локальных переменных). Это делает допустимым не только использование С, но и С++ на платформе PIC18. MPLAB-C18 - в отличие от MPLAB-C - производит положительное впечатление. Рекомендуется избегать ошибок, описанных в "баг-листе". Имеет библиотеки по работе с периферией, но стандартные С-библиотеки реализованы не полностью. Обладает хорошей эффективностью при генерации кода. Поддерживает стековую и статическую организацию локальных переменных. Уникальная опция для экономии памяти данных - статический оверлей. Но вс╦ равно эффективность генерируемого кода достаточно низкая и совместимость с С-стандартом неполная. HT-PICC18 - поддерживается многими производителями (видимо, из-за успеха HT-PICC). Из-за специфических конструкций - расширений языка является нестандартным. Также внутренняя организация не соответствует организации стандартного С-компилятора - отсутствует стек. Это является причиной невозможности портировать многоплатформенную RTOS на PIC. Хорошо реализована поддержка библиотек. Созда╦т достаточно эффективный код как по размеру, так и по скорости исполнения. CCS C18 - можно рекомендовать как средство быстрого решения простой задачи. Также можно использовать для обучения основам программирования на С для PIC-контроллеров. Имеет встроенные функции для работы с периферией и частично реализованные С и математическую библиотеки. Неудобно работать с большими проектами, содержащими С и ассемблер. Из-за отсутствия собственного симулятора (используется MPLAB) трудно отлаживать. Так же, как и HT-PICC18, не имеет стека данных и не является стандартным С-компилятором. За сч╦т нестандартных решений имеет высокую эффективность кода, особенно в случае простых операций. В статье остался нерассмотренным вопрос использования "периферийных" библиотек, входящих в состав MPLAB C18 и CCS C. Среди таких библиотечных функций особенно будет интересна работа с CAN (PIC18F458/448/258/248 имеют встроенный CAN-контроллер). Также интересна разработка метода оптимального кодирования для того или иного компилятора, но этот вопрос требует длительного исследования и накопления опыта, поэтому мы расскажем об этом в следующих статьях. С другой стороны, компиляторы для PIC18 быстрыми темпами совершенствуются (благо архитектура PIC18 этому способствует), и можно предположить, что через короткий промежуток времени ситуация кардинально улучшится. Для полноценной разработки нельзя ориентироваться только на выбор компилятора. Должен присутствовать полноценный программный симулятор и/или эмулятор. Поэтому окончательно сделать выбор помогут именно имеющиеся в распоряжении разработчика внутрисхемные средства отладки. Дальнейшее изучение возможности использования С на платформе PIC18 нужно проводить самостоятельно. Почти все рассматриваемые в статье программные продукты имеют демо-версии (с ограничением времени использования 1 месяц, а не функциональности) и наилучшая рекомендация - попробовать собрать простой проект на языке С (или смешанный С плюс ассемблер) и понять, обеспечивает ли компилятор выигрыш по времени разработки и удобству дальнейшего сопровождения изделия. Время, потраченное на освоение новых средств разработки (в общем-то, незначительное), окупается скоростью и удобством разработки новых проектов. |
PatrickSkype пишет... Провести время в гейм ресурсе всегда занимательно плюс любопытно, а именно для пользователей, те что ежедневно присматривают по выпуски также выпусками гейм новостей. Игральный портал https://irongamers.ru/sale/keys/22764>магазин игровых аккаунтов irongamers.ru представлен вполне распространенным информационным материалом для участников, ресурс представляем читателям ресурс, где еще осуществимо никак не лишь пролистать проверенно новые и насущие онлайн возобновление, а дополнительно IronGamers проверять переписку между участниками, проводить дискуссии, заходить в магазин игр, эксплуатировать рекомендации, направление также знаки. На сайте найдется форум, точно знающим пользователям, так еще и дебютантам, каковы сейчас заводят личный путь по геймплей, наторелые посетители https://irongamers.ru/ повседневно обмениваются заслуживающие внимания результатами и инсайтами по пункте ваше мнение, также новенькие смогут шаг за шагом выучить произвольной гейм с помощью напутствий к тому же руководства, либо внеси тему к разбору в этому сайте IronGamers.Ru юзеров. Переходите затем пользуйтесь проверенной информацией внутри геймс территории к тому же прилагайте игровые навыки на собтсвенной стажировке. 19/08/2020 20:34:23 |
Ваш комментарий к статье | ||||