IAR Embedded Workbench for AVR. Быстрый старт.
IAR — это один из лучших компиляторов С/С++ для множества микроконтроллеров, начиная от 8051 и заканчивая продвинутыми ARMами. Про создание проектов для ARM уже писали в учебном курсе имени этого же контроллера, я же напишу про создание проекта для AVR, особенностей работы и отладки в нем.
Для avr существует 2 версии — бесплатная, с ограничением по коду до 4кБ и полная с 30-и дневным триалом. Так же не трудно найти вылеченную. Какую выбрать каждый решит для себя сам, скажу только что для нормальной работы вылеченной нужно запрещать программе выход в интернет. Последняя на данный момент версия 5.51. Ее я и буду использовать.
Настройка среды.
После установки стоит сделать начальные настройки среды.
1. Tools->Options. В Messages в пункте Show build messages выбрать тип All. После этого при компиляции будет выводиться информация о размере программы и данных.
2. Т.к. среда не поддерживает программаторы типа AVR ISP, то стоит к ней прикрутить внешний программатор, например SinaProg. Для этого жмем Tools->Configure Tools.
Настройки там понятны и без объяснений. Строку Initial Directory можно оставить пустой или указать в ней путь к выходным файлам текущего проекта. Тогда после запуска сразу будет выбираться папка с прошивкой. В принципе для этого предназначена галка Redirect to Output Window, с которой путь должен автоматом подставляться для текущего проекта. Но у меня она почему-то не заработала.
Создание проекта.
Запускаем IAR Embedded Workbench и видим главное окно программы:
Выбираем в меню — Project->Create New Project. . В появившемся окне можно выбрать язык (ASM, C, C++) и тип проекта. Совместимость с AVR Studio нам не к чему, поэтому создадим приложение на обычном С.
Программа сразу предложит сохранить полученный проект. Сохраняем и получаем на выходе следующий сгенерированный код:
Да, iar точно знает, что краткость сестра таланта:) Пользоваться этим пока не возможно, поэтому можно переходить к настройкам проекта.
Настройка проекта.
Выбираем в меню — Project->Options. или жмем Alt+F7 и видим первое окно настроек:
Обязательно выбираем тип используемого процессора. Тип памяти влияет на размер адреса переменных в памяти данных. У модели tiny — 1 байт на адрес, у small — 2 байта.
Далее переходим к вкладке С/С++ Compiler:
В принципе по началу тут можно ничего и не трогать, но про самые основные вкладки сказать стоит. В Plain ‘char’ is выбирается тип переменной char по умолчанию — со знаком или нет.
В Optimization как нетрудно догадаться выбирается тип и уровень оптимизации.
И на вкладке List можно включить опцию генерации ассемблерного листинга.
И последняя, весьма важная вкладка — Linker
По умолчанию линкер создает свой, весьма специфический, файл с расширением *.d90. Со всей отладочной информацией и прочей кучей мусора. Прошивать его в контроллер напрямую нельзя, поэтому вывод необходимо перенастроить. Тут есть 2 пути:
1. Переназначить типы выходных файлов во что-то стандартное. Но тут есть свои тонкости. Например, если на вкладке Output сделать выходной файл intel-standart, то потеряется возможность символьной отладки. Т.к. отлаживать через листинг радости мало, то нужно ставить тип выходного файла в debug-intel-std, а на вкладке Extra Output уже выбирать intel-standart. Тогда будет и нормальная отладка в симуляторе и готовый выходной файл для прошивки. Но если в программе используются переменные из eeprom, то получим ошибку линкера. Поэтому всегда лучше использовать второй путь.
2. Если в программе используется eeprom, то линкеру надо сообщить что ему необходимо создать 2 файла. Для этого сразу переходим к последней вкладке Extra Options, разрешаем использовать их и в поле вводим:
В результате получим на выходе 3 файла:
- *.d90 — для отладки
- *.eeprom.hex — для прошивки eeprom
- *.flash.hex — сама прошивка
На этом настройку проекта можно считать законченной и переходить к написанию программы.
Написание Hello World.
На самом деле писать программу мигающую чем-то я не буду;) А только опишу особенности реализации С в применении к iar. Итак, сразу включаем в самое начало программы следующее:
Без определения *1 не будут доступны битовые поля регистров. Почему так сделано мне самому не понятно:) В *2 идет как раз описание регистров. Без *3 не будет некоторых макроопределений.
Задержки в iar сделаны через количество тактов, однако в 99% случаев гораздо удобней указывать время задержки в микро или миллисекундах. Поэтому добавим следующие определения:
Теперь задержку можно сделать так:
Для размещения констант во флеш используется модификатор __flash:
Для переменных в eeprom соответственно модификатор __eeprom.
Как читать и писать такие переменные компилятор разберется сам, при этом для чтения не нужны извращения типа pgm_read_byte. Все переменные этих типов могут быть только глобальными и запись во флеш не поддерживается. Т.е. команд типа SPM нет. Как пример запись в eeprom константы из flash:
Прерывания объявляются следующим образом:
Где TIMER2_OVF_vect тип прерывания, имена прерываний можно посмотреть в файле описания конкретного процессора. Для mega16 — это C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 5.4\\avr\\inc\\iom16.h
TIMER2_interrupt — просто имя прерывания, можно написать что угодно.
В остальном тут такой же С как и в любой другой среде.
Отладка в IAR
Отлаживать программу можно в железе, через любые аппаратные отладчики. JtagIce и Dragon самые известные и доступные из них. При этом показывается содержимое регистров, переменные, снимаются/устанавливаюся аппаратные флаги и срабатывают прерывания. Причем в отличие от gcc + студия переменные показываются вне зависимости от ее типа и расположения. В общем отладка в железе в iar проста и приятна. Тип отладчика выбирается в свойствах проекта. Там же он и настраивается.
У кого отладчиков нет можно использовать симулятор. Тут уже не так радостно. IAR, в отличие от студии, не эмулирует работу процессора. Это означает, что таймеры в симуляторе не считают, флаг готовности аппаратного i2c не устанавливается и так далее. И установка флага нужного прерывания вручную не приведет к вызову этого прерывания. Но переменные все равно показываются правильно. После gcc это неимоверно доставляет.
Итак, отладка в iar. Для запуска отладчика нажимаем зеленый треугольник на правом панеле.
Дополнительные окна открываются через меню View.
Переменные (окно 4) могут показываться в окнах Watch, Auto, Statics и Locals. В окне Watch отображаются только выбранные переменные, в Statics все статические, а в Locals только локальные переменные. В окне Auto будут только переменные недавно изменившие значение. В качестве переменных можно указывать названия регистров. К примеру на переменную PORTB будет выводиться текущее состояние этого порта.
При желании можно сделать вывод каждого окна отдельно или выбирать нужное закладкой внизу окна. Способ вывода меняется перетягиванием нужных окон.
Окно Регистры (окно 3)отличается от переменных тем, что в нем выводится не только значение выбранного регистра, но и связанные с ним регистры. Например для порта А также будет выведены DDRA и PINA. Так же значение каждого регистра можно развернуть для показа битовых полей.
В окне дизасемблера (окно 2) и самой программы (окно 1) будет текущий выполняемый фрагмент кода. Если при этом выбрать окно ассемблера, то при при трассировке будет выполнятся каждая ассемблерная команда по очереди. Так же ставить точки останова можно в любом окне.
Так можно отладить всю логику программы, кроме работы железа и прерываний. И если с симуляцией железа сделать ничего нельзя, кроме как ставить нужные биты вручную, то вызвать прерывания автоматически все таки можно. Хоть и не удобно, но все же можно. Для этого выбираем Simulator->Interrups.
В этом окне выбирается тип прерывания, через сколько времени оно начнет работать и интервалы срабатывания. После установки прерывания оно начнет регулярно срабатывать. До симулирования работы проца конечно далеко, но все же лучше чем вообще ничего.
IAR Embedded Workbench
С течением времени всегда кажется, что у соседа трава зеленее.
В смысле, компилятор круче, проще, удобней и оптимизирует лучше.
Начнём с IAR Embedded Workbench IDE for AVR — посмотрим, как хотя бы запустить в нем проект.
Будем рассматривать язык С — без плюсов — поэтому уясним, что никаких ссылок «at» и битовых переменных тут не используется.
Теперь наш удел — это выражения типа «portLight |= 1 _ Options. «:
Во вкладке «General options» — «Target» определяем конфигурацию процессора — справа от текстового поля есть кнопочка
В «General options» — «System» есть крайне важная и крайне незаметная галочка «Enable bit definitions in I/O-Include files» — поставим её, и будет нам счастье: компилятор будет понимать не только названия регистров, но и названия битов регистров. То есть можно будет писать примерно так: «GICR |= 1 Создание сайта – «Вебпроцесс»
Все права защищены © AVR.RU 2007—2017.
Цитирование материалов сайта только с разрешения владельца.
Использование среды разработки IAR Ebedded Workbench IDE
Введение
Используя разные микроконтроллеры, возникает необходимость выбрать удобную среду разработки. Нам есть из чего выбирать – будь то IAR или Keil µVision, или, даже Code Composer Studio.
Ниже пойдет речь об IAR Embedded Workbench IDE на примере STM32F10x. Эта среда разработки достаточно мощная. Имеются всякие вкусняшки.
Настройка IAR
В первую очередь нужно настроить IAR.
Основные настройки
Настройки проекта
Допустим, создавать новый проект мы умеем (если нет, то Project->Create New Project…). После создания проекта нам доступны две конфигурации проекта – Debug и Release. Переключаться между ними можно в окне Workspace:
Рис. 1 – Окно Workspace
Удобно использовать несколько конфигураций. В конфигурации Debug можно выбрать симулятор программатора, а в Release – конкретный программатор (к примеру, J-Link). Что позволит сначала отлаживать в симуляторе, не теряя время на прошивку микроконтроллера, а потом уже прошивать под конфигурацией Release.
Добавлять новые конфигурации можно через меню: Project->Edit Configurations.
Опции самого проекта – Project->Options… (Alt+F7). Для открытия окна опций проекта нужно выделить сам проект в окне Workspace, иначе откроются опции того файла, который был выделен.
Настройки буду приводить для конфигурации Debug (в скобках – для Release).
Открываем опции (Alt+F7)
- General Options.
Вкладка Target. Выбираем Device – например, ST STM32F100xB (у меня STM32VLDISCOVERY с STM32F100RBT6 на борту). - С/C++ Compiler.
Вкладка Optimizations. Выбираем Level – None (для Release — High).
Вкладка Preprocessor. В поле Additional include directories вводим все пути заголовочных файлов, имеющих расширение *.h. Например:
$PROJ_DIR$\..\Lib\include\
Остальные переменные, на подобии $PROJ_DIR$, можете посмотреть в хелпе по F1, введя в поиске Argument variables.
В этой же вкладке, в поле Defined symbols вписываем нужные дефайны. Это аналог обычной директивы #define. Для нашей отладочной платки нужно ввести STM32F10X_MD_VL, если мы хотим использовать библиотеки от криворуких STM’овцев.
Так же для конфигурации Debug можно завести дефайн DEBUG. Это удобно, если использовать, к примеру, конструкцию:
#ifndef DEBUG
Delay(100 часов);
#endif
Зачем же нам ждать это время при отладке, правда же? - Linker.
Вкладка Config. Здесь можно выбрать конфигурационный файл для линковщика, если это необходимо (если у вас не 8-ми битный микроконтроллер). Если необходимо перераспределить память микроконтроллера по-своему, то нужно ковырять файл *.icf. Об этом можно прочитать в Help->C/C++ Development Guide страница 81 Linking your application. Если эта тема сложная, то можно написать об этом отдельно. Спрашивайте, если что. - Debugger.
Вкладка Setup. В поле Driver выбираем Simulator (для Release – свой программатор. Для моей платы – ST-LINK. В настройках для него нужно выбрать интерфейс SWD).
Рис. 2 – Дерево проекта
И, напоследок, создайте дерево проекта на ваш вкус.
Некоторые приемы
Горячие клавиши
Поиск:
Обычный поиск – Ctrl+F
Найти дальше – F3
Поиск по файлам проекта – Ctrl+Shift+F
Шагать по найденному (или по ошибкам/ворнингам) – F4
Навигация по проекту:
Перейти к объявлению переменной (даже, если она в другом файле) – F12 — очень полезная функция!
Навигация вперед – Alt+Right
Навигация назад – Alt+Left
Разное:
Открыть header/source – Ctrl+Shift+H (или П.К.М в редакторе, и в контекстном меню выбрать Open Header/Source File)
Закомментировать выделенный блок – Ctrl+K
Разкомментировать – Ctrl+Shift+K
Выделить содержимое скобок – Ctrl+B
Автовыравнивание – Ctrl+T
Поставить/убрать Breakpoint – F9
Вставить шаблон – Ctrl+Shift+Space – тоже интересная штука.
Чтобы добавить свой шаблон, нужно открыть файл CodeTemplates.ENU.txt через меню Edit->Code Templates->Edit Templates
Теперь можно ввести примерно следующее:
Знак «&» нужен для быстрого доступа (буква будет подчеркнута). Можно использовать знак «>» для создания подменю. Все интуитивно понятно.
Сохраним файл и вызовем Template menu (Ctrl+Shift+Space). В нем выберем Warning:
Рис. 3 – Вызов меню Template
Введем необходимый текст:
Рис. 4 – Шаблон Warning
Жмякаем по кнопке OK. В результате, появится строчка:
Рис. 5 – Результат использования шаблона
При компиляции все ворнинги и ерроры (#error ) будут выводиться в окне Build.
Заключение
В этой статье были приведены основные возможности IAR, позволяющие достаточно быстро ориентироваться в проекте. Рекомендую использовать горячие клавиши. Это значительно сокращает время работы над проектом.
Буду признателен, если читатель дополнит или поправит меня.