IAR Embedded Workbench for AVR. Быстрый старт.

IAR — это один из лучших компиляторов С/С++ для множества микроконтроллеров, начиная от 8051 и заканчивая продвинутыми ARMами. Про создание проектов для ARM уже писали в учебном курсе имени этого же контроллера, я же напишу про создание проекта для AVR, особенностей работы и отладки в нем.
IAR AVR
Для avr существует 2 версии — бесплатная, с ограничением по коду до 4кБ и полная с 30-и дневным триалом. Так же не трудно найти вылеченную. Какую выбрать каждый решит для себя сам, скажу только что для нормальной работы вылеченной нужно запрещать программе выход в интернет. Последняя на данный момент версия 5.51. Ее я и буду использовать.
Настройка среды.
После установки стоит сделать начальные настройки среды.
1. Tools->Options... В Messages в пункте Show build messages выбрать тип All. После этого при компиляции будет выводиться информация о размере программы и данных.
2. Т.к. среда не поддерживает программаторы типа AVR ISP, то стоит к ней прикрутить внешний программатор, например SinaProg. Для этого жмем Tools->Configure Tools...
SinaProg
Настройки там понятны и без объяснений. Строку Initial Directory можно оставить пустой или указать в ней путь к выходным файлам текущего проекта. Тогда после запуска сразу будет выбираться папка с прошивкой. В принципе для этого предназначена галка Redirect to Output Window, с которой путь должен автоматом подставляться для текущего проекта. Но у меня она почему-то не заработала.

Создание проекта.
Запускаем IAR Embedded Workbench и видим главное окно программы:
IAR AVR Main
Выбираем в меню — Project->Create New Project.... В появившемся окне можно выбрать язык (ASM, C, C++) и тип проекта. Совместимость с AVR Studio нам не к чему, поэтому создадим приложение на обычном С.
IAR AVR Select
Программа сразу предложит сохранить полученный проект. Сохраняем и получаем на выходе следующий сгенерированный код:
int main( void )
{
  return 0;
}

Да, iar точно знает, что краткость сестра таланта:) Пользоваться этим пока не возможно, поэтому можно переходить к настройкам проекта.

Настройка проекта.
Выбираем в меню — Project->Options... или жмем Alt+F7 и видим первое окно настроек:
IAR AVR Select
Обязательно выбираем тип используемого процессора. Тип памяти влияет на размер адреса переменных в памяти данных. У модели tiny — 1 байт на адрес, у small — 2 байта.
Далее переходим к вкладке С/С++ Compiler:
IAR AVR С/С++
В принципе по началу тут можно ничего и не трогать, но про самые основные вкладки сказать стоит. В Plain 'char' is выбирается тип переменной char по умолчанию — со знаком или нет.
В Optimization как нетрудно догадаться выбирается тип и уровень оптимизации.
И на вкладке List можно включить опцию генерации ассемблерного листинга.
И последняя, весьма важная вкладка — Linker
IAR AVR Linker
По умолчанию линкер создает свой, весьма специфический, файл с расширением *.d90. Со всей отладочной информацией и прочей кучей мусора. Прошивать его в контроллер напрямую нельзя, поэтому вывод необходимо перенастроить. Тут есть 2 пути:
1. Переназначить типы выходных файлов во что-то стандартное. Но тут есть свои тонкости. Например, если на вкладке Output сделать выходной файл intel-standart, то потеряется возможность символьной отладки. Т.к. отлаживать через листинг радости мало, то нужно ставить тип выходного файла в debug-intel-std, а на вкладке Extra Output уже выбирать intel-standart. Тогда будет и нормальная отладка в симуляторе и готовый выходной файл для прошивки. Но если в программе используются переменные из eeprom, то получим ошибку линкера. Поэтому всегда лучше использовать второй путь.
2. Если в программе используется eeprom, то линкеру надо сообщить что ему необходимо создать 2 файла. Для этого сразу переходим к последней вкладке Extra Options, разрешаем использовать их и в поле вводим:

-Ointel-standard,(CODE)=.flash.hex
-Ointel-standard,(XDATA)=.eeprom.hex 

В результате получим на выходе 3 файла:
  • *.d90 — для отладки
  • *.eeprom.hex — для прошивки eeprom
  • *.flash.hex — сама прошивка
На этом настройку проекта можно считать законченной и переходить к написанию программы.

Написание Hello World.
На самом деле писать программу мигающую чем-то я не буду;) А только опишу особенности реализации С в применении к iar. Итак, сразу включаем в самое начало программы следующее:
#define   ENABLE_BIT_DEFINITIONS    // *1
#include  <ioavr.h>                 // *2
#include  <intrinsics.h>            // *3

Без определения *1 не будут доступны битовые поля регистров. Почему так сделано мне самому не понятно:) В *2 идет как раз описание регистров. Без *3 не будет некоторых макроопределений.

  TIMSK=1<<TOIE2 | 1<<OCIE1A;     // *1 и *2
  __enable_interrupt();           // *3
  asm("sei");                     // Аналогично *3

Задержки в iar сделаны через количество тактов, однако в 99% случаев гораздо удобней указывать время задержки в микро или миллисекундах. Поэтому добавим следующие определения:
#define   F_CPU 8000000UL
#define   delay_ms(temp)(__delay_cycles((temp * F_CPU)/1000));
#define   delay_us(temp)(__delay_cycles((temp * F_CPU)/1000000UL));

Теперь задержку можно сделать так:

  __delay_cycles(1000);           // Средствами IAR в тактах
  delay_ms(100);                  // Сразу в миллисекундах

Для размещения констант во флеш используется модификатор __flash:
unsigned char __flash const_mode=1;

Для переменных в eeprom соответственно модификатор __eeprom.
unsigned char __eeprom mode1;

Как читать и писать такие переменные компилятор разберется сам, при этом для чтения не нужны извращения типа pgm_read_byte. Все переменные этих типов могут быть только глобальными и запись во флеш не поддерживается. Т.е. команд типа SPM нет. Как пример запись в eeprom константы из flash:
unsigned char __eeprom eeprom_var;
unsigned char __flash flash_const=1;
eeprom_var=flash_const;

Прерывания объявляются следующим образом:
#pragma vector=TIMER2_OVF_vect
__interrupt void TIMER2_interrupt (void)
{
}

Где 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. Для запуска отладчика нажимаем зеленый треугольник на правом панеле.
Debug
Дополнительные окна открываются через меню View.
Переменные (окно 4) могут показываться в окнах Watch, Auto, Statics и Locals. В окне Watch отображаются только выбранные переменные, в Statics все статические, а в Locals только локальные переменные. В окне Auto будут только переменные недавно изменившие значение. В качестве переменных можно указывать названия регистров. К примеру на переменную PORTB будет выводиться текущее состояние этого порта.
При желании можно сделать вывод каждого окна отдельно или выбирать нужное закладкой внизу окна. Способ вывода меняется перетягиванием нужных окон.
Окно Регистры (окно 3)отличается от переменных тем, что в нем выводится не только значение выбранного регистра, но и связанные с ним регистры. Например для порта А также будет выведены DDRA и PINA. Так же значение каждого регистра можно развернуть для показа битовых полей.
В окне дизасемблера (окно 2) и самой программы (окно 1) будет текущий выполняемый фрагмент кода. Если при этом выбрать окно ассемблера, то при при трассировке будет выполнятся каждая ассемблерная команда по очереди. Так же ставить точки останова можно в любом окне.
Так можно отладить всю логику программы, кроме работы железа и прерываний. И если с симуляцией железа сделать ничего нельзя, кроме как ставить нужные биты вручную, то вызвать прерывания автоматически все таки можно. Хоть и не удобно, но все же можно. Для этого выбираем Simulator->Interrups...
Interrups
В этом окне выбирается тип прерывания, через сколько времени оно начнет работать и интервалы срабатывания. После установки прерывания оно начнет регулярно срабатывать. До симулирования работы проца конечно далеко, но все же лучше чем вообще ничего.

  • +2
  • 29 июня 2011, 18:43
  • PRC

Комментарии (18)

RSS свернуть / развернуть
Я с иара и начинал. Настраивается вполне понятно и интуитивно.
Алсо, пришлось чуть чуть посидеть с дебагером — русские буковки не хотели отображаться в редакторе кода))
Потом всё же перелез на gcc — ради совместимости с написанные под неё либами.
0
похоже большая часть любителей авр стартовала с иар :) я кажется с версии 3.2 :)
сейчас так же на gcc сижу.
0
Мне в gcc отладка просто убивает, особенно после отладки в иаре через jtag:)
0
а я ей вообще не пользуюсь, если что не работало хватало анализа асма.
0
Кстати, а в иаре jtag айс нормально работает?
Просто в авр студии по жосткому тупит и тормозит…
0
У меня не тормозило.
0
Я начинал с gcc. На IAR потупил немного и плюнул, как-то там всё несколько по-кривому, да денег за него много хотят и не кроссплатформенный.
0
В принципе для этого предназначена галка Redirect to Output Window
Вообще-то, как я понимаю, она предназначена не для этого, а для перехвата вывода консольной проги и направления его в окошко сообщений компиляции. А чтобы подставляло путь к проекту — должен быть какой-нить макрос. Но насчет них надо курить доки.
0
  • avatar
  • Vga
  • 29 июня 2011, 21:02
Значит я ступил, бывает.
0
> А чтобы подставляло путь к проекту — должен быть какой-нить макрос.

$PROJ_DIR$
0
Тоже не работает.
0
$PROJ_DIR$ — это путь до твоего файла проекта (.ewp)
Песня в том, что объявляя относительные пути ты можещь запустить проект из любого места, не меняя настроек. Примерно так как во вложении.



В окошке инструментов стартовый каталог определяет место откуда будет запускаться тулза.
Пусть нужна вот такая команда
«C:\IAR\JLinkARM_V358c\JLinkGDBServer.exe»
Можно сделать так

или так


в первом случае рабочий каталог $PROJ_DIR$ (там где лежит .ewp), во втором C:\IAR\JLinkARM_V358c
0
Почему-то ссылки не вставились. :(

$PROJ_DIR$ — это путь до твоего файла проекта (.ewp)
Песня в том, что объявляя относительные пути ты можещь запустить проект из любого места, не меняя настроек. Примерно так как во вложении.
dl.dropbox.com/u/12253020/path.gif

В окошке инструментов стартовый каталог определяет место откуда будет запускаться тулза.
Пусть нужна вот такая команда
«C:\IAR\JLinkARM_V358c\JLinkGDBServer.exe»
Можно сделать так
dl.dropbox.com/u/12253020/rel.gif
или так
dl.dropbox.com/u/12253020/abs.gif

в первом случае рабочий каталог $PROJ_DIR$ (там где лежит .ewp), во втором C:\IAR\JLinkARM_V358c
0
А я пытаюсь «подружить»: SVN (VisualSVN для VS2008), Proteus 7.6 (ISIS), Enterprise Architect, VS2008, IAR 5.51, WinAVR-20100110, AVR Studio 4 и AVR Studio 5… ух, короче, всё это в одном проекте.
Вот хранилище поделки: mysvn.ru/cop/Example/
Там читать: mysvn.ru/cop/Example/readme.txt

Думается мне, что если писать на чистом C++, без особых выкрутасов, то можно иметь кросс-компиляторный проект в одном почти флаконе. Конкретно этот у меня компилируется и в IAR 5.51 и в WinAVR-20100110.

Отлаживаю одновременно в: ISIS, IAR и AVR Studio (через ubrof8, который генерится IAR'ом в папке exe специально для этого).

Цели:
1. Проектирование сверху (UML2).
2. Использование удобной IDE VS2008.

Я пишу «образ» проекта в EA, используя редактор UML2, потом генерю образ(ы) класса(ов) в виде исходников и подключаю их в VS2008. Там же в студии через Makefile компилирую. Отладку, симуляцию можно делать где угодно.
Переключение компилятора в Defines.h (одном месте).
Моделируемая схема: Example.dsn — Proteus ISIS 7.6 (пока что-то не задаётся работа с LCD 20x4).

Хочу в XXI в.
0
  • avatar
  • uni
  • 16 июля 2011, 22:09
#define   ENABLE_BIT_DEFINITIONS    // *1
Не обязательно вставлять этот макрос. В меню GENERAL OPTIONS во вкладке System достаточно поставить галочку в поле "Enable bit definitions in I/O-include files" и будут доступны битовые поля регистров.
0
глупый вопрос а будет ли работать HappyJTAG2 в iar...?
0
Нет, не будет, я пробовал, сам хотел.
0
>>Совместимость с AVR Studio нам не к чему
Почему? Думаю зря что не к чему.
>>поэтому создадим приложение на обычном С.
Си и Си ++ здесь не при чём. Можно любой проект открывать в AVR Studio.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.