Тарифы Услуги Сим-карты

Iar создание проекта. Установка IAR. Что имеет смысл переделать в контроллере

Многофункциональная среда разработки приложений на языках C, C++ и ассемблере для целого ряда микроконтроллеров от различных производителей.

Основные преимущества пакета – дружественный пользовательский интерфейс и непревзойденная оптимизация генерируемого кода. Кроме этого реализована поддержка различных операционных систем реального времени и JTAG -адаптеров сторонних компаний.

В настоящее время IAR Embedded Workbench поддерживает работу с 8-, 16-, 32-разрядными микроконтроллерами от , ARM, NEC, Micronas, Dallas Semiconductor/ , Ember, Luminary, OKI, Samsung, TI/Chipcon, Silicon Labs и . Для каждой платформы существует своя среда разработки, в частности ARM микроконтроллерам соответствует версия пакета IAR Embedded Workbench for ARM.

Программная среда включает в себя:
1. C/C++ компилятор – один из самых эффективных в своем роде. В нем также присутствует полная поддержка ANSI C.
2. Транслятор ассемблера, включающий в себя макроассемблер для программ реального времени и препроцессор для C/C++компилятора.
3. Компоновщик, поддерживающий более тридцати различных выходных форматов для совместного использования с внутрисхемными эмуляторами.
4. Текстовый редактор, настроенный на синтаксис языка Си и имеющий удобный пользовательский интерфейс, автоматическое выделение ошибок программного кода, настраиваемую инструментальную панель, подсветку блоков, а также удобную навигацию по именам подпрограмм, макросов и переменных.
5. Симулятор и отладчик в кодах Си и ассемблера. Отладчик позволяет просматривать области EEPROM, DATA, CODE, а также регистры ввода/вывода, устанавливать точки останова и аппаратные флаги, обрабатывать прерывания с предсказанием. Кроме этого предусмотрен контроль стека и любых локальных переменных, режим пошагового выполнения программы. Тип отладчика и его настройки устанавливаются в свойствах проекта. Если отладчик отсутствует, то на помощь приходит симулятор, который, однако, не имеет возможности эмулировать работу процессора.
6. Менеджер проектов, облегчающий контроль и управление рабочими модулями.
7. Дополнительные утилиты для работы с оптимизированной CLIB/DLIB библиотекой.

Интегрированная система помощи облегчает написание программ в данной среде. Предусмотрено взаимодействие с утилитой AVR Studio. Помимо прочего в IAR Embedded Workbench существует возможность самостоятельного управления оптимизацией отдельных модулей проекта, что упрощает процесс отладки, а также позволяет ускорить работу программы или сэкономить на памяти.

IAR Embedded Workbench была разработана IAR Systems, более двадцати лет являющейся одной из ведущих компанией по созданию C/C++ компиляторов для встраиваемых микроконтроллерных устройств и систем. Ее штаб-квартира находится в старинном городе Уппсала (Швеция). В настоящее время программы IAR Systems используют по всему миру более сотни тысяч разработчиков, производителей телекоммуникационного и промышленного оборудования, медицинской и компьютерной техники, среди которых такие гиганты, как Apple Computer, Cisco Systems, Motorola, Hewlett-Packard и Siemens.

IAR Embedded Workbench является коммерческим продуктом, его стоимость составляет около 3000 долларов за одну пользовательскую лицензию. Однако, в качестве дополнения к полнофункциональной версии, существует бесплатный вариант среды программирования с единственным ограничением на размер выходного кода до 4 или 8 КБ в зависимости от модели контроллера. Этот вариант подойдет для первого знакомства с программой, а также написания небольших приложений. Можно найти и взломанную версию, но для ее нормальной работы придется отключать выход в интернет.

Язык интерфейса IAR Embedded Workbench – английский.

Рассматриваемая среда работает под управлением только операционной системы Microsoft Windows версий 95, 98, NT, 2000, XP, Vista, 7 (не имеет значения 32- или 64-битных).

Распространение программы: платная. Есть бесплатная версия с ограничениями на размер кода в зависимости от МК

FAQ. Компилятор IAR C для микроконтроллеров AVR фирмы Atmel

В. Полетаев

Frequently asked questions
ответы на часто задаваемые вопросы по компилятору IAR C для микроконтроллеров AVR фирмы Atmel дает В. Полетаев ([email protected])

Компилятор IAR C для микроконтроллеров AVR фирмы Atmel

Существует несколько версий компилятора - 1.40, 1.41, 1.50, но по некоторым причинам наибольшее распространение в России получила версия 1.40c. Версия компилятора смотрится в файле ewa90d.txt - не путать с версией оболочки.

Вопрос: Я установил IAR Embedded Workbench и “патчи” к нему. Что мне ещё нужно?

Ответ: Версия 1.40 поставляется с не совсем корректными.xcl-файлами для линкера. Кроме того, описания регистров микроконтроллеров в нём неполные. Для нормальной работы имеет смысл либо взять комплект.xcl- и h-файлов от более новой версии компилятора, либо с сайта фирмы Atmel (ftp://www.atmel.com/pub/atmel/avr030.zip ; ftp://www.atmel.com/pub/atmel/io_def.zip).

Файлы из этих архивов следует переписать в соответствующие каталоги вместо поставлявшихся с компилятором.

При работе в Embedded workshop правильное имя.xcl-файла следует указывать отдельно для каждой target в Project|Options|XLINK|Include|XCL file name, включив Override default.

Вопрос: С чего начать?

Кроме того, рекомендуется посетить на сайте фирмы Atmel раздел http://www.atmel.com/atmel/products/prod201.htm и скачать оттуда ряд документов:

  • AVR030: Getting Started With C for AVR (http://www.atmel.com/atmel/acrobat/doc1483.pdf). Хороший пример для быстрого начала работы. В качестве приложения к нему идёт ftp://www.atmel.com/pub/atmel/avr030.zip - сборник правильных.xcl-файлов для различных конфигураций микроконтроллеров.
  • AVR032: Linker Command Files for the IAR ICCA90 Compiler (http://www.atmel.com/atmel/acrobat/doc1079.pdf). Здесь описывается, как составлять.xcl-файлы. Просто пересказ документации от IAR. Как приложение идёт ещё один пример с.xcl-файлами, но более ранний. Лучше пользоваться вариантом от Getting Started.

В этом разделе есть ещё ряд документов, посвящённых работе с Си и заслуживающих внимательного ознакомления, из которых особенно отмечу AVR035: Efficient C Coding for AVR (http://www.atmel.com/atmel/acrobat/doc1497.pdf).

Для эффективной работы следует также взять с http://www.atmel.com/atmel/products/prod200.htm последнюю редакцию datasheet и errata на выбранный микроконтроллер и тщательно их изучить, особенно errata.

Вопрос: Отличается ли IAR C от стандартного ANSI C?

Ответ: Да. В IAR C входят различные расширения, связанные с реализацией компилятора для микропроцессора с гарвардской архитектурой (два адресных пространства - для кода и данных) и для более эффективной работы в ограниченных условиях микроконтроллеров. Подробнее смотрите AT90S C Compiler Programming Help, раздел Language extensions.

В исполняющей системе (библиотеке) отсутствуют функции, связанные с вызовами операционной системы (операции с файлами и пр.).

Вопрос: Можно ли разместить таблицы (строки и т. д.) в ПЗУ?

Ответ: Можно. Для этого существует расширение языка - зарезервированное слово flash. Переменная, описанная с применением данного слова, размещается в адресном пространстве кода и доступна только по чтению.

Flash char aaa = “aaa”; flash char bbb = “bbb”; flash char ccc = “ccc”; flash char flash *xxx = {aaa, bbb, ccc, 0};

Если используется более чем один уровень вложенности, как в вышеприведённом примере (массив указателей на строки), то flash должен стоять для каждого уровня.

Вопрос: Как передать строку char flash * в функцию? Прямое написание строки в параметрах функции не проходит: printf_P(“Строка\n”);

Ответ: Вариант 1.

Описать её отдельно:

{ static flash char str = “Строка\n”; printf_P(str); }

Вариант 2. Пользоваться явным преобразованием типа:

Printf_P((char flash *)(int)“Строка\n”);

Можно слегка сократить запись при помощи #define:

#define F (char flash *)(int) printf_P(F“Строка\n”);

В этом варианте строка будет размещаться в сегменте CSTR. По умолчанию данный сегмент размещается в адресном пространстве данных, поэтому для корректной работы надо исправить XCL-файл. Надо убрать упоминание CSTR из строки:

Z(DATA)CSTR,CONST=9000-FFFF

(если эта строка присутствует в исходном XCL-файле) и вставить его в строку:

Z(CODE)INTVEC,RCODE,CDATA0, CDATA1,CCSTR,SWITCH, FLASH,CODE=0-1FFFF

Вариант 3. Использовать ключ –E.

Этот вариант возможен только при работе с компилятором из командной строки. После указания данного ключа компилятор размещает строковые данные в сегменте CSTR и данные типа const - в CONST, причём считает, что эти сегменты расположены в адресном пространстве кода.

В этом варианте также требуется исправление XCL-файла с переносом CSTR и CONST в строку -Z(CODE).

Кроме того, в этом варианте могут возникнуть проблемы с использованием библиотеки, оттранслированной без ключа –E.

Ну и наконец, в этом варианте компилятор выдаёт предупреждающее сообщение Dangerous configuration, которое можно отключить только вместе со всеми предупреждениями, что неудобно.

На мой взгяд, наиболее приемлимыми являются первый и второй варианты.

Вопрос: Как преобразовать указатель char * в char flash *?

Ответ: Воспользоваться промежуточным int:

Char *s; char flash *p; p = (char flash *)(int)s;

Вопрос: Где размещаются переменные типа const?

Ответ: Это зависит от установленных опций компилятора. По умолчанию (если не задан ни один из параметров –y или –E) эти переменные размещаются в сегменте CONST, который считается находящимся в адресном пространстве данных. Данный режим делался с расчётом на использование внешней энергонезависимой памяти данных и в большинстве случаев не применяется. Кроме того, в этом режиме компоновщик помещает эти переменные в область кода по тем же адресам, что может вызвать серьёзные проблемы.

Если установлен режим –y –“Writable constants and strings”, то компилятор строит код в полном соотвествии со стандартом ANSI, размещая константы и строки в адресном пространстве данных. Их начальные значения сохраняются в адресном пространстве кода в сегментах CDATA0 или CDATA1 для констант и CCSTR - для строк, а в момент запуска они переписываются в ОЗУ в сегменты IDATA0/IDATA1 и ECSTR, соответственно. Основной недостаток данного режима - непроизводительное использование ОЗУ.

Вариант с указанием ключа –E рассматривался выше. Одновременное использование ключей –y и –E невозможно.

Для написания оптимального варианта программы лучше не пользоваться const, а описывать неизменяемые данные как flash, что приведёт к их явному размещению в памяти программ без лишнего расхода ОЗУ.

Вопрос: Как удобнее работать с битами в регистрах внешних устройств?

Ответ: Для начала описать полезный макрос:

#define Bit(n) (1 << (n)) Для установки бита n в порту p: p |= Bit(n); Для сброса бита: p &= ~Bit(n); Для проверки бита: if ((p & Bit(n)) != 0) ...

Полный перечень всех битов доступен на сайте фирмы Atmel в разделе software, файл io_def.zip. Следует поместить эти.h-файлы из этого архива в каталог C:\IAR\EW22DEMO\A90\INC\ вместо существующих.

Вопрос: У меня не работает printf. Что делать для правильного вывода информации в последовательный порт?

Ответ: Во-первых, включить в свою программу отдельную функцию putchar:

Int putchar(int c) { while ((USR & (1 << UDRE)) == 0); UDR = c; return c; }

Стандартный putchar в библиотеке представляет один оператор RET и не выполняет никакого вывода.

Для доступа к именованным названиям битов регистров следует взять правильный.h-файл из io_def.zip.

Эту функцию следует включать только при компиляции под target=release, иначе под отладчиком может отказаться работать окно Terminal I/O. Простейший способ это сделать - определить для target=debug символ DEBUG (Project|Options|ICCA90|#define, ввести символ) и окружить определение putchar директивами условной компиляции (например, #ifndef DEBUG … #endif).

Во-вторых, следует вставить в начало своей программы процедуру установки скорости обмена последовательного порта. Например, для кварца 5,53 МГц и скорости обмена 115200 бод надо установить:

UBRR = 2; UCR = 0x18;

В-третьих, обычный printf будет работать только с включенным режимом –y –“Writable constants and strings”.

В-четвёртых, надо правильно выбрать вариант функции printf. Подробности смотрите в AT90S C Compiler Programming Help, Configuration, Input and output.

Стандартная функция printf требует для своей работы минимум 134 байт ОЗУ в стеке. Это страшное расточительство, поэтому есть сокращённые версии printf, обладающие значительно меньшими возможностями форматирования (в частности, не поддерживают задание поля ширины вывода), зато не требующие для работы так много ОЗУ.

В качестве окончательного решения проблемы я бы порекомендовал сделать следующее:

Взять за основу файл C:\IAR\ \EW22DEMO\A90\ETC\intwri.c и произвести в нём следующие изменения:

  • добавить строку #include “pgmspace.h”;
  • заменить описание функции на int printf_P (const char flash *format, ...);
  • изменить тип массива hex с const на flash: static flash char hex = “0123456789ABCDEF”.

После этого не забыть внести нужные изменения в XCL-файл (перенести CSTR в раздел CODE).

Разумеется, надо вставить putchar и инициализацию порта.

После этого забыть про существование printf и пользоваться только printf_P.

Вопрос: Мне не хватает ОЗУ. Что делать?

Если кратко - включить оптимизацию по размеру. По возможности, использовать байтовые (char) переменные. Hе перегружать стек локальными переменными большого размера. Стараться делать функции большого (в меру!) размера - так компилятор разложит максимум переменных по регистрам. Об эффективности лучше судить по листингу с включенным режимом insert mnemonics. Передавать в функции лучше не более 2 входных переменных - так они лягут в регистры. Размещать константы в ПЗУ, с ключевым словом flash.

Внимательно изучить используемый.xcl-файл - он приведён в поставке только для примера и кое-где неэффективен. Поставить нижнюю границу всех DATA сегментов (RSTACK, CSTACK, IDATA1, UDATA1, ECSTR) в 60 - так будет достигнуто полное, без дырок, использование ОЗУ. Уточнить размеры аппаратного (RSTACK) и программного (CSTACK) стеков.

Вопрос: У меня не работает порт A. Почему?

Ответ: Порт A используется как шина адреса-данных при работе с внешним ОЗУ. Если оно не используется, то в.xcl-файле следует закомментировать строку -e?RSTACK_IN_EXTERNAL_RAM=? C_STARTUP.

Вопрос: Можно ли создать выходной файл в двоичном виде?

Ответ: Да. Для этого следует указать в качестве выходного формата mpds. Полученный файл с расширением.tsk и будет образом ПЗУ.

Вопрос: Как заменить библиотечный модуль на свой?

Ответ: Проще всего поместить исходный файл с ним в свой рабочий каталог проекта и подключить его к файлу проекта. Дальше оболочка сама разберётся с его типом (.c или.s90) и позаботится о его пристыковке раньше библиотечного.

Вопрос: Как лучше отлаживать программу?

Ответ: Если нужно отладить алгоритм, не зависимый от работы периферии, можно воспользоваться C-SPY. Преимущество - отладка на уровне исходного текста (но можно посмотреть и ассемблерный текст), недостаток - периферия практически отсутствует.

Если нужна работа со стандартной периферией, можно воспользоваться Atmel AVR studio 3.0, которая достаточно точно эмулирует поведение кристаллов. Для передачи в неё файла следует указать xlink’у тип выходного формата debug. Если в окне исходного текста в Astudio символы искажены, то следует установить подходящий моноширинный фонт (например, terminal для ДОС-кодировки русских букв или Courier для Windows) в меню Edit|Fonts… ВHИМАHИЕ! IAR адресует память программ побайтно, в то время как Atmel - пословно. Поэтому, если в map-файле от компоновщика подпрограмма имеет адрес 1234h, то в astudio надо указывать адрес 1234h/2=091Ah.

Вопрос: EWA90 работает только под Windows?

Ответ: Оболочка - да. Однако есть command-line версии компилятора, ассемблера и компоновщика, которые прекрасно работают под MS-DOS, используя встроенный DOS Extender от Phar Lap Software, Inc.

Основная сложность при работе с ними - огромное количество ключей. Рекомендую для начала поработать в виндовой оболочке, а затем взять список ключей из шапки листинга и поместить его в make-файл.

Вопрос: Периодически при компиляции совершенно правильного файла выдаётся системная ошибка. Что делать?

Ответ: Повторить компиляцию. Это какая-то ошибка в компиляторе, которая иногда возникает.

Ответ: На российском сайте фирмы Atmel есть подборка практических рекомендаций: http://www.atmel.ru/AVR/AVR.htm и http://www.atmel.ru/Spec/Spec.htm .

Ответы на вопросы по AVR, задаваемые посетителями сайта ATMEL, можно найти на http://www.atmel.ru/FAQ/FAQ.htm .

Можно задать вопросы российским представителям Atmel - фирме ЭФО через конференцию Atmel на сайте http://www.efo.ru .

Большое число специалистов по AVR регулярно общается и в конференции по микроконтроллерам на сайте Телесистем -

Среда IAR Workbench проприетарна и требует лицензирования (в случае если ваш код превышает 32 КБ), однако её вполне хватает для домашнего использования.

Непосредственно среда разработки, в состав которой входит компилятор. После установки IAR потребуется зарегистрировать его, заполнив анкету на сайте компании. Укажите реальный почтовый ящик, на него вам вышлют лицензионный ключ.

С сайта ST Microelectronics нужно будет скачать архив - в нём содержатся:

  • CMSIS (Cortex Microcontroller Software Interface Standard) - библиотека, определяющая работу ядра, того самого Cortex M3 (о ней мы поговорим позже);
  • SPL (Standart Peripheral Library) - стандартная периферийная библиотека, которая сэкономит вам много сил в конфигурации той или иной периферии;
  • Examples - если нужно изучить, как работает новая для вас периферия, то в этой папке лежит множество примеров на все случаи жизни.

Запустив IAR, создайте рабочее пространство File New Workspace . Далее новый проект, меню Project Create New Project…

Программу можно писать на ассемблере, Си или С++. Мы будем использовать язык программирования Си.

Созданный проект необходимо настроить, для этого открываем меню Project Options . Во вкладке General Options выбираем целевой микроконтроллер - STM32F100x4 .


Кроме того, в Library Configuration ставим галочку Use CMSIS . Среда IAR уже включает в себя эту библиотеку, и добавлять её к проекту необязательно, однако новые версии могут выдавать предупреждение вида:

Warning : Label ‘xxxxx’ is defined pubweak in a section implicitly declared root

Проблема решается заменой некоторых строк во встроенной библиотеке CMSIS: в местах упоминания CODE:REORDER добавьте NOROOT(1) . Например:

PUBWEAK NMI_Handler
SECTION .text:CODE:REORDER:NOROOT(1)
NMI_Handler

Далее добавляем путь, по которому будут храниться файлы *.c и *.h - для этого заходим во вкладку C/C++ Compile r ⇒ Preprocessor и добавляем &PROJDIR& (переменная, содержащий путь к папке с проектом).


В разделе Debugger выбираем в качестве отладчика ST-LINK . Ставим галочки Use flash loader и Verify во вкладке Download .

На днях произошла ужасная вещь - на клавиатуру ноутбука вылилось небольшое, но достаточное для глюков количество воды. Хорошо, что вода оказалось чистой, и особенно то, что в Красноярске вода содержит мало примесей (за несколько лет в чайнике нет ни капли накипи). Что нужно делать, если что-то подобное случилось с Вами: Быстро перевернуть ноутбук, позволить жидкости вытечь из клавиатуры (при этом стоит следить, чтобы жидкость в этот момент не стекала на матрицу.Вытереть тряпкой остатки воды(спорный пункт!) Я взял баллон со сжатым воздухом и продул под всеми клавишами, при этом вылетело много жидкости. Возможно, таким образом можно лишь усугубить ситуацию, загнав жидкость потоком воздуха куда не следует.Теперь нужно разобрать ноутбук и просушить клавиатуру. Других вариантов нет. Имейте ввиду, что если Вы конкретно залили клавиатуру, то можете попрощаться с ноутбуком и вот почему: Клавиатур пока нет ни в России, ни в Китае! Я обзвонил много сервисных центров, и даже общался с л…

Мало кто знает, а в особенности те, кто только начинает изучать микроконтроллеры STM32, что их можно запрограммировать не имея специального программатора. Необходимо лишь выбрать режим загрузки контроллера через встроенный загрузчик, подключитьcя через UART и записать необходимый код. Теперь обо всем подробнее. Большая часть контроллеров STM32 имеет встроенный (нестираемый) загрузчик в специальной области памяти, который работает по протоколам UART, SPI, I2C и CAN. Конечно же проще всего работать через UART, т.к. он есть почти у каждого, кто имеет дела с электроникой, поэтому его и будем рассматривать. Выбор области памяти, из которой осуществляется загрузка контроллера осуществляется подачей низкого или высокого уровня на ножки BOOTx (может быть как одна, так и несколько). Подробнее о том, как выбрать загрузчик на конкретном контроллере указано в AN2606. Так же в AN2606 указано, какой интерфейс контроллера можно использовать для программирования. Еще, чтобы записать код в к…

У контроллеров STM32, в большинстве своем, отсутствует как таковой буфер приемника UART. Исходя из этой особенности, приходится создавать кольцевой буфер и использовать прерывания. При низкой тактовой частоте ядра и высоких скоростях UART это оказывается очень накладно как по производительности, так и по энергопотреблению.
Всего этого можно избежать при помощи DMA, но как? Ведь при настройке DMA указывается фиксированный размер буфера, в который копируются принятые данные. К тому же у DMA есть прерывания только при полном и половинном заполнении буфера. Фактически, если вы уверены, что длина принимаемых данных не превысит длину буфера, прерывания от DMA можно не использовать вовсе. А обойтись только прерыванием IDLE от UART.
Флаг прерывания IDLE в интерфейсе UART выставляется в случае, если после стоп-бита последнего переданного символа на линии RX нет данных в течении времени приема одного символа. Флаг IDLE сбрасывается программно.