|
С. Емец, М. Еременко
Компиляторы Си для микроконтроллеров PIC18. Часть 1
Использование языков высокого уровня в сложных проектах на базе микроконтроллеров фирмы Microchip (www.microchip.com) до недавнего времени казалось неоправданным. Для микроконтроллеров "среднего" (mid-range) семейства работоспособными можно было считать компиляторы С фирмы HT-SOFT (www.htsoft.com) и компиляторы IAR (www.iar.com). Также существовал MPLAB C (www.microchip.com), но с большим количеством ограничений и даже ошибок. (Здесь ещё можно упомянуть компиляторы: CCS http://www.ccsinfo.com, Bytecraft http://www.bytecraft.com/compile.html, С2С http://www.geocities.com/SiliconValley/Network/3656/c2c/c.html, ССХХ http://www.bknd.com и FED PICMicro® MCU C http://www.fored.co.uk/Eindex.htm). Известны несколько портов свободных компиляторов для Microchip (ссылки на них можно найти на http://www.gnupic.org). Работающие в России разработчики устройств с использованием PIC16 отдавали предпочтение компилятору HT-SOFT. Но даже используя этот неплохой компилятор, было невозможно воспользоваться готовым кодом, написанным для других платформ, или перенести программу, разработанную на этом компиляторе, на другой микроконтроллер. Таким образом, среди большого количества существующих Си-компиляторов для PIC16 не было ни одного совместимого со стандартами языка, поэтому "компиляторами языка Си" эти программы назывались условно. Архитектура целевых кристаллов (PIC16) из-за малого количества ресурсов, страничного распределения памяти, неудобной индексной адресации и некоторых других архитектурных ограничений не обеспечивала возможности компилятору генерировать эффективный код. Для обхода этих ограничений разработчики компиляторов вынуждены были отходить от стандартов (ANSI) и перекладывать на пользователя заботу об оптимизации кода. Например, в HT-PICC приходилось вручную распределять переменные по банкам памяти и пользоваться абсолютной адресацией.
Выход нового семейства микроконтроллеров PIC18 был направлен фирмой Microchip на удовлетворение потребностей разработчиков, использующих эффективные Си-компиляторы с 8-бит контроллерами, оптимизированными для исполнения программ, написанных на языках высокого уровня. Ведущие производители компиляторов для PIC16 (IAR, HT-SOFT, CCS) откликнулись на это событие предоставлением компиляторов для нового семейства. Microchip также предложил принципиально новый компилятор MPLAB-C18. Также доступны компиляторы других производителей, но данные компиляторы либо не предлагают демо-версий, либо находятся на начальном уровне разработки, либо имеют ограничения, которые не позволяют применять их в качестве рабочего средства.
Особенности ядра PIC18
Попробуем рассмотреть, какие новшества были внесены в архитектуру PIC18, и как они могут “облегчить жизнь” компилятору языка Си или другого языка высокого уровня. Я не буду подробно описывать архитектуру PIC18, с которой можно ознакомиться в документе PICmicro 18C MCU Family Reference Manual фирменной документации на сайте или компакт-диске фирмы Microchip, а остановлюсь на ключевых изменениях. При первом взгляде на систему команд кажется, что ничего существенного не изменилось, но это совсем не так:
- Следует рассмотреть работу индексных регистров (неотображённую в системе команд). Это INDFn, POST-DECn, POSTINCn, PREINCn, PLUSWn и FSRn (FSRnH + FSRnL), где n = 0,1,2: архитектура предоставляет три указателя, которые могут адресовать всю память данных. При этом поддерживается инкремент/декремент указателя и возможность базово-индексной адресации (при обращении к PLUSWn адрес памяти вычисляется как FSRn + WREG). Это одно из самых значительных архитектурных улучшений, которое позволяет реализовать работу стека данных для хранения параметров и локальных переменных при вызове функции. Таким образом, один из FSR может использоваться как указатель стека, другой - как указатель стека при входе в функцию (frame pointer) и использоваться для доступа к локальным переменным, третий может использоваться в качестве индекса массива. Следует заметить, что аккумулятор и индексный регистр - это один и тот же WREG, и время работы с локальными переменными будет дольше, чем с глобальными или статическими (непосредственная адресация).
- Следующим по важности улучшением можно назвать доступ к аппаратному стеку переходов. Целесообразность использования аппаратного стека для хранения 3-байт адреса вызвана необходимостью быстрых вызовов (CALL) и прерываний, при использовании байтной шины данных потребовалось бы 2 лишних машинных цикла. Но при этом возможность манипулировать с указателем аппаратного стека и TOSU, TOSH, TOSL позволяет реализовать переключение контекста и многозадачность. Так что появилась возможность портировать многозадачную RTOS (например, uCOS-II www.micrium.com ) на PICmicro! Также можно реализовать LIBC функции setjmp() и longjmp().
- Интересно использование "памяти быстрого доступа" (access bank) для хранения глобальных переменных и передачи параметров в функции.
- Возможность доступа к любой ячейке памяти посредством MOVFF позволяет эффективнее обращаться к большим структурам данных, занимающих несколько банков памяти (если рассматривать данную инструкцию как обращение к памяти, а банк, выбранный в BSR, как рабочие регистры, то получим архитектуру, сходную с "настоящими" RISС-процессорами и возможность портировать GNU Cи компилятор на PIC!).
- Необходимо упомянуть новую возможность табличного доступа к программной памяти с помощью команд TBLRD, TBLWR, что позволяет хранить и работать с большими массивами данных в программной памяти.
- Ускорить вычисления поможет умножение 8-разрядных чисел за один такт.
Несмотря на кажущуюся схожесть архитектуры и набора инструкций семейств PIC16 и PIC18, новое семейство имеет архитектуру гораздо более приспособленную для реализации компиляторов Си и языков высокого уровня. Подтверждением этому является быстрый выход Си-компиляторов для PIC18. При этом IAR System предлагает не только Си, но и упрощённый вариант С++.
Интегрированные среды для работы с компиляторами С для PIC18
Для удобной работы с компилятором Си требуется интегрированная среда (IDE) с менеджером проектов, симулятором и/или интерфейсом эмулятора, текстовым редактором и так далее. Прежде чем переходить к рассмотрению собственно компиляторов, рассмотрим IDE, применяющиеся для разработки приложений на PIC18:
- IAR предлагает одинаковую среду (рис. 1) для разных процессоров (что должно облегчить перенос исходного кода на другую платформу и не требовать дополнительного времени на освоение). Также следует отметить возможность описывать внешние события и управлять средой и симулятором с помощью специального скриптового языка. Также очень хорошо реализована отладка Си-приложений - то есть удобно просматривать структуры данных, как глобальные, так и локальные, и управлять симулятором на основе структуры Си-кода. Недостатком является отсутствие поддержки недорогих внутрисхемных эмуляторов (ICD2). Данная среда работает с компилятором от IAR.
![Среда IAR](/images/arhiv/02_08/emez1.jpg) Рисунок 1. Среда IAR
- HTSOFT на момент работы над статьёй предложила первую версию среды HTIDE, которая содержит в себе менеджер проектов и симулятор, также имеется интересная возможность моделирования периферийных устройств (рис. 2). HTIDE предполагает использование компилятора HT-PICC18. По уровню комфорта при отладке Си программ среда сравнима с MPLAB 6, но при этом реализован просмотр локальных переменных и структур. Следует заметить, что среда содержит в себе "глюки" (например, не понимает имена файлов, содержащих пробелы - My Documents), и использовать её в настоящее время нужно с осторожностью.
![Среда HI-TIDE](/images/arhiv/02_08/emez2.jpg) Рисунок 2. Среда HI-TIDE
- В среде от CCS отсутствует симулятор, то есть среда представляет собой менеджер проектов и редактор, ориентированный на работу с CCS C. В составе редактора есть средство, позволяющее "сгенерировать" часть кода для инициализации микроконтроллера (рис. 3). Интерфейс с MPLAB реализован очень хорошо и не требует от пользователя работы с конфигурационными файлами. Для разработки проектов с использованием CCS C потребуется MPLAB в качестве симулятора или эмулятора (при наличии аппаратной поддержки) для отладки программ.
![PCW и утилиты конфигурации](/images/arhiv/02_08/emez3.jpg) Рисунок 3. PCW и утилиты конфигурации (CCS)
- MPLAB фирмы Microchip(16-bit версии 5.XX) - наиболее популярная среда разработки, позволяющая подключать любой из перечисленных компиляторов и имеющая наибольшую поддержку аппаратных эмуляторов (например ICE2000), включая недорогие дебаггеры-отладчики-программаторы ICD (DV164001) и ICD2 (DV164007). Следует заметить, что среда MPLAB не является удобной для отладки Си-приложений, так как в ней отсутствует возможность просмотра сложных структур данных, локальных переменных и т.п. Окно просмотра переменных watchне предназначено для работы с языком Си (есть возможность побайтного просмотра только глобальных символов); отсутствует возможность отладки Си "без входа в функцию", "до выхода" (step out, step over). То есть использовать среду MPLAB для отладки Си-проектов довольно неудобно. За длительное время существования этой среды производителем не были проведены улучшения для отладки Си-программ. Но следует отметить, что разработка средств работы с языками высокого уровня для PIC16 не являлась приоритетным направлением для Microchip. Огромный плюс - привычная среда (для бывших пользователей ассемблера) и удобство работы с отладочными средствами Microchip(эмуляторы, дебаггеры, программаторы) (рис. 4).
![Среда MPLAB IDE](/images/arhiv/02_08/emez4.jpg) Рисунок 4. Среда MPLAB IDE
- Учитывая пожелания разработчиков, Microchip выпустил 32-bit MPLAB 6.XX. Это новая интегрированная среда предназначена полностью заменить MPLAB 5.XX. В новой среде переделан графический интерфейс, добавлены новые возможности, в редакторе появилось цветовое выделение операторов и директив компилятора. Кроме того, эта среда может работать с аппаратными средствами отладки, подключенными к USB-интерфейсу. Среда имеет возможность подключать Си-компиляторы, но на момент выхода статьи поддерживалось подключение только MPLAB C18. Возможность подключения компиляторов других фирм появится в ближайшем будущем.
- Невозможно не упомянуть очень распространённую у нас среду (рис. 5)отечественной фирмы Фитон(www.phyton.ru), в которой предусмотрено подключение Си-компиляторов HT-PICC и MPLAB C18. По своим возможностям эта среда похожа на среду от IAR: также хорошо реализованы просмотр структур данных и скриптовый язык для управления средой и моделирования внешних воздействий. Среда может использоваться либо с симулятором, либо с эмулятором собственного производства. По опыту работы с PIC16, и программные, и аппаратные средства, предлагаемые фирмой Фитон, оставили хорошее впечатление.
![Среда Phyton Project-MC](/images/arhiv/02_08/emez5.jpg) Рисунок 5. Среда Phyton Project-MC
Из рассматриваемых в статье сред разработки невозможно выявить однозначного лидера (табл. 1). С одной стороны, отличное впечатление производит среда от IAR. Замечательно проработана периферия при работе с симулятором-отладчиком C-SPY, отображение SFR реализовано очень удобно. Главным недостатком является отсутствие поддержки недорогих аппаратных средств (например ICD2) и высокая стоимость. Работает только с IAR-компилятором.
Таблица 1. Сравнение интегрированных сред разработки и отладки, работающих с компиляторами Си
Интегрированная среда
|
MPLAB - IDE
|
HI-TIDE
|
IAR IDE
|
ССS С
|
Phyton Project-MC
|
"Свой" компилятор Си
|
MPLAB - C18
|
HI-TECH PICC18
|
IAR PIC18
|
ССS С
|
Нет
|
Программный симулятор
|
Есть
|
Есть
|
Есть
|
Нет
|
Есть
|
Поддержка аппаратных отладочных средств
|
ICE2000, ICD2, PROMATE II, PICSTART+
|
Нет
|
ICE2000
|
Нет
|
Эмулятор PICE-MC
|
Интеграция сторонних средств разработки
|
Есть
|
Нет
|
Нет
|
Требуется MPLAB
|
Требуется HT-PICC, MPLAB C18
|
Встроенные ассемблер и линкер
|
Есть
|
Есть
|
Есть
|
Нет
|
Есть
|
Удобство работы, функциональность
|
Хорошее
|
Хорошее
|
Отличное
|
Среднее
|
Очень хорошее
|
Очень неплохо реализован просмотр переменных и сложных структур данных в среде фирмы Фитон, к ней же подключается внутрисхемный эмулятор собственного производства, что упрощает отладку. Недостаток - демо-версия имеет ограничение по коду (за среду-симулятор без Си-компилятора необходимо платить) и невозможность использования аппаратных средств отладки производства Microchip (например, недорогого ICD2). Из компиляторов поддерживает HT-PICC и MPLAB C, а также позволяет загружать для отладки проекты, предварительно созданные в IAR или CCS.
CCS может быть полезна начинающим разработчикам, так как имеет возможность автоматически создавать исходные файлы, которые можно рассматривать в качестве примера программирования периферийных устройств.
Есть надежда, что в новой среде MPLAB 6.XX Microchip исправит недостатки, присущие предыдущей версии и добавит подключение компиляторов других фирм.
HITIDE в настоящее время находится в состоянии разработки (зато предоставляется бесплатно), и может быть использована совместно с HT-PICC.
Из вышесказанного следует, что выбор среды в первую очередь зависит от имеющихся в распоряжении разработчика аппаратных средств отладки (или их отсутствия).
|