Создание и отладка программ
Разработка программ в AVR Studio начинается с создания проекта. После установки программы это легче всего сделать, через менеджер создания проектов во вкладке Project/Project Wizard.
Рис.1 Project Wizard AVR Studio
После нажатия экранной кнопки New Project появится окно на рис.1, в котором надо задать название и директорию размещения проекта, например FirstProject. В качестве типа проекта необходимо выбрать Atmel AVR Assembler (проекты AVR GCC используют Си-компилятор WinAVR). Сейчас и в дальнейшем очень важно размещать все файлы проекта в одной папке, что избавит от многих проблем при редактировании и переносе программ.
Рис.2 Project Wizard AVR Studio
На следующем этапе необходимо выбрать модель микроконтроллера и тип отладочного средства, как показано на рис.2 (в нашем случае это ATmega8 и AVR Simulator соответственно). После чего откроется окно текстового редактора, где и будет непосредственно происходить создание программы (см рис.3).
Рис.3 Текстовый редактор AVR Studio
В окне проекта Project можно видеть все компоненты программы: файл с исходным текстом FirstProject.asm, заголовочный файл m8def.inc, а также выходные файлы .lst, .map, .hex и .obj с одноименными названиями. В разделе Labels находятся символьные имена меток, встречающиеся в программе.
Компиляция проекта осуществляется после нажатия на иконку Assemble либо Assemble and Run. В последнем случае сразу же запускается и программа отладчика. Если в исходным тексте были допущены ошибки, то .hex, естественно, создан не будет, а в окне Build, появится описание всех ошибок и строки где они находятся. После внесения необходимых исправлений и успешной сборки, в окне Build отобразится статистика о проекте в виде диапазонов адресов и размеров секций FLASH, SRAM и EEPROM.
Рис.4 Работа в симуляторе AVR Studio
Проверить работоспособность программы можно в симуляторе, либо с помощью любого другого отладчика. Его запуск происходит после нажатия иконки Start Debagging. На рис.4 показана работа в симуляторе и вид основных отладочных окон, в которых можно наблюдать за состоянием содержимого различных областей памяти и символьными именами, объявленных в тексте программы. Все эти данные доступны для редактирования на ходу.
Отладку можно вести как в пошаговом (кнопки Step Into, Step Over, Step Out), так в автоматическом (Auto Step) или ускоренном (Run) режимах. Имеется возможность использовать также точки останова. Симулятор, встречая строку, в которой находится точка останова, принудительно останавливает свое выполнение, после чего можно детально изучить содержимое отладочных окон. Управление точками останова производится кнопками Toggle Brekpoint и Remove all Program Brekpoints. В окне Disassembler можно видеть соответствующие машинных кодов командам ассемблера AVR.
AVR Studio предоставляет программисту интуитивно-понятный пользовательский интерфейс и при ее освоении никаких проблем, как правило, не возникает. Управление свойствами встроенного текстового редактора и среды в целом ничем не отличается от подобных действий в различных офисных приложениях. Детальное описание всех компонентов AVR Studio можно найти во встроенной справочной системе.
Введение
Это краткое пошаговое руководство по созданию проекта в Atmel Studio. Мы разберем как создать проект, как добавить в него ASF библиотеки, как его скомпилировать и как записывать прошивку в микроконтроллер, используя аппаратный отладчик или программатор.
Речь пойдет о создании проекта для ARM микроконтроллера SAM3S, но аналогичным образом создаются проекты и для других микроконтроллеров фирмы Atmel — xmega, atmega, attiny
Подразумевается, что у вас уже установлена среда разработки. Но если это не так, то самое время сделать это. Переходите на сайт Atmel, регистрируйтесь и скачивайте Atmel Studio.
Создание проекта
Выбираем в верхнем меню пункт File > New > Project. или нажимаем комбинацию кнопок Ctrl + Shift + N.
Откроется окно, в котором нужно задать шаблон проекта, имя и место его хранения. Выбираем C/C++ > User Board > User Board SAM3S. Имя и место сохранения указываем по своему желания. Я назвал свой проект Test.
Последнее поле в этом окне — Solution name. Solution или решение — это некий «контейнер», который включает в себя один или несколько проектов Atmel Studio (аналог workspace или рабочего пространства в IAR). Такое объединение удобно использовать, когда идет работа над несколькими смежными проектами.
Если поставить галочку Create directory for solution, то будет создана директория с именем решения и файлами решения, в которой будет поддиректория, содержащая наш проект. Нам это сейчас не нужно, поэтому галочку можно снять.
Жмем ОК и в следующем диалоговом окне задаем тип микроконтроллера. Это нужно для того, чтобы Atmel Studio подключила к проекту требуемые заголовочные файлы.
Выбираем SAM3S4B, жмем ОК и Atmel Studio создает проект с заданными параметрами.
Если мы заглянем в директорию проекта, то увидим следующий набор файлов.
В папке Debug сохраняются результаты компиляции проекта — объектные файлы и прошивки в различных форматах. В папке src хранятся исходники проекта — C и C++ файлы.
Посмотрим на Atmel Studio. Перед нами созданный только что проект. С правой стороны у нас проводник, отображающий иерархию проекта. Чуть ниже окно — свойства. Там отображается информация о выбранном файле. С левой стороны — редактор кода, сейчас там открыт файл main.c. Снизу — консоль, на которую выводится различная информация о результатах компиляции проекта. Сверху — меню и меню бар.
ASF библиотеки
Чтобы убедиться в работоспособности платы Karma-SAM3S, добавим в проект простой код. Для начала подключим к проекту несколько ASF библиотек.
ASF (Atmel Software Framework) — это бесплатный набор библиотек для Atmel микроконтроллеров, интегрированный в среду разработки. ASF включает в себя драйверы внутренней периферии, сервисы и библиотеки для внешних устройств. Каждая библиотека имеет документацию с описанием и примерами. Чтобы использовать ASF библиотеки нужно создавать проект на основе шаблона (board template) или ASF примера.
Чтобы добавить ASF библиотеки к проекту, запускаем ASF Wizard. Это можно сделать с помощью меню Project > ASF Wizard, комбинации Alt + W или одноименной кнопки в меню баре.
Для первого проекта понадобятся следующие драйвера:
PIO — Parallel Input/Output Controller
PMC — Power Management Controller
WDT — Watchdog Timer
Ищем их в списке, выделяем и добавляем в окно Selected Modules с помощью кнопки Add.
Когда нужные драйверы добавлены, нажимаем кнопку Apply. В следующих окнах жмем ОК и со всем соглашаемся.
Выбранные библиотеки появятся в проводнике и в заголовочном файле asf.h. Теперь их можно использовать в своем проекте.
Тестовый код
Закрываем ASF Wizard и копируем в main.c следующий код.
Детально разбирать его не будем, но несколько комментариев сказать стоит.
В начале программы запрещается работа сторожевого таймера, разрешается тактирование контроллера ввода-вывода и вывод PA17 настраивается на выход. К этому выводу на плате Karma-SAM3S подключен светодиод.
Далее идет бесконечный цикл, в котором состояние вывода PA17 меняется на противоположное. Чтобы смена состояний не была слишком быстрой, используется программная задержка — Delay(). Значение задержки подобрано так, чтобы светодиод моргал с частотой единицы Гц.
Микроконтроллер SAM3S4B имеет гибкую систему тактирования, которая обычно настраивается в начале программы. В этом примере мы ее не трогаем, поэтому микроконтроллер тактируется от внутреннего низкочастотного генератора с частотой 4 МГц.
Обратите внимание, библиотечные функции имеют префикс, по которому легко понять к какой периферии они относятся. Чтобы получить информацию о любой функции или константе в программе, нужно кликнуть по ее имени правой кнопкой мыши и выбрать пункт Goto Implementation.
Компиляция проекта
Теперь нужно скомпилировать проект. Это можно сделать с помощью меню Build > Build Solution, кнопки F7 или одноименной иконки в меню баре.
Если компиляция и сборка прошла успешно, в консоли появится сообщение Build succeeded.
В противном случае там будут отображены найденные ошибки.
Полученная прошивка лежит в папке проекта. Можно загрузить ее в микроконтроллер с помощью загрузчика, а можно с помощью аппаратного отладчика. В последнем случае, загрузка выполняется прямо из Atmel Studio.
Загрузка прошивки
Подаем на плату Karma-SAM3S питание, подключаем SAM-ICE (или J-link) и выбираем в меню Debug > Start Without Debugging.
При первом включении Atmel Studio предложит выбрать инструмент — аппаратный отладчик или симулятор. Но поскольку Atmel Studio пока что не поддерживает программную симуляцию ARM микроконтроллеров, выбора как такового нет.
Если выбрать в меню пункт Debug > Start Debugging and Break , то Atmel Studio перейдет в режим отладки кода. Откроются окна отображающие содержимое регистров и памяти микроконтроллера, а в редакторе кода появится указатель. При нажатии кнопки F11 код будет выполняться построчно.
Также есть другой вариант загрузки прошивки. Выбираем в меню Tools > Device Programming.
В открывшемся окне Device Programming выбираем отладчик, интерфейс и нажимаем кнопку Apply. Atmel Studio автоматически определит тип микроконтроллера. Выбираем пункт Memories и нажимаем кнопку Program, чтобы записать прошивку в микроконтроллер.
Другие пункты в окне Device Programming позволяют настраивать интерфейс программирования, получать информацию об отладчике и микроконтроллере, устанавливать конфигурационные биты.
Программирование и отладка микроконтроллеров ARM Cortex-M4 фирмы Atmel в среде операционной системы Linux. Часть 2
400 Мбайт, содержащий более 70000 файлов).
Даже не смотря на то, что библиотеку ASF можно загрузить отдельно [8] и она рассчитана на использование в том числе и компилятора GCC, однако автор не сумел вручную выделить из библиотеки необходимые файлы для создания простейшей программы для микроконтроллера Atmel SAM4S16C.
Автор предлагает такой путь:
1.Чтобы получить минимальный компилируемый проект использовать интегрированную среду разработки Atmel Studio IDE, предназначенную для операционных систем Windows и основанную на среде Microsoft Visual Studio 2013.
2. В дальнейшем «вручную» добавлять необходимые компоненты в полученный проект, копируя их из отдельно загруженной библиотеки ASF.
Среда Atmel Studio IDE
Среда Atmel Studio IDE поставляется бесплатно, загрузить ее можно с официального сайта [9]. Во время установки на компьютере или виртуальной машине под управлением Windows следует выбрать архитектуру ARM и указать необходимость установить библиотеку ASF (рис. 5).
Рис. 5. Особенности установки Atmel Studio IDE.
После установки следует запустить Atmel Studio IDE и создать новый проект, выбрав пункт меню «File -> New -> Project…». Далее следует выбрать тип проекта «GCC C ASF Board Project», как показано на рис. 6.
Рис. 6. Выбор типа проекта в Atmel Studio IDE.
Далее откроется окно выбора аппаратной платформы, для которой будет собираться проект (рис. 7)
Рис. 7. Выбор микроконтроллера
Можно ввести название микроконтроллера, но в данном случае проще задать название оценочной платы. Для этого следует выбрать пункт «Select by Board» и выбрать название «SAM4S-EK» (рис. 7). В списке ниже следует выбрать появившийся пункт с наименованием микроконтроллера «ATSAM4S16C» и нажать «Ok».
После того, как проект будет создан, файлы исходного кода будут размещены в указанном ранее (рис. 6) каталоге (в случае автора c:\Users\andrey_k\Documents\Atmel Studio\7.0\GccBoardProject1\GccBoardProject1\src).
Каталог src теперь можно перенести в операционную систему Linux в каталог проекта, например, в каталог
/sam/. Его структура представлена на рис. 8.
Рис. 8. Структура простейшего проекта
-
Скрипт линковщика — это файл
Добавление модуля из библиотеки ASF
/sam/src/ASF/common/services/delay.
Кроме этого необходимо включить компонент delay.h в сборку, добавив в конце файла
Как видно, добавление отдельных компонентов из библиотеки ASF в проект не представляет больших трудностей.
Код простейшей программы
Листинг файла main.c приведен ниже:
Функция board_init() инициализирует порты ввода/вывода (GPIO) микроконтроллера в соответствии с подключенными к ним внешними электронными компонентами, в том числе настраивает порты ввода/вывода как выходы для включения/выключения расположенных на плате светодиодов. Функция board_init() находится в файле src/ASF/sam/borads/sam4s_ek/init.c.
Предоставлена возможность выбирать, какие порты будут проинициализированы, а какие нет — с помощью макроопределений в файле src/config/conf_borad.h.
Функция sysclk_init() отвечает за инициализацию блока тактирования микроконтроллера. После сброса включается встроенный RC-генератор на 4 МГц [12]. Функция sysclk_init() активирует генератор, работающий от внешнего кварцевого резонатора на 12 МГц, а также настраивает блок фазовой автоподстройки частоты PLL, так, чтобы частота тактирования ядра микроконтроллера составляла 120МГц.
Изменить настройки тактирования можно меняя значения макроопределений в файле src/config/conf_clock.h.
Далее в бесконечном цикле последовательно вызываются функции включения и выключения светодиодов оценочной платы: LED_On() и LED_Off(). В качестве аргумента передается макроопределение LED1_GPIO, что соответствует зеленому светодиоду, подключенному к порту PA20. Функции LED_On(), LED_Off() и макроопределение LED1_GPIO определены в исходных файлах в каталоге src/ASF/sam/borads/sam4s_ek/, который содержит помимо прочего описание подключения светодиодов к выводам микроконтроллера.
Вызов функции delay_ms(500), входящей в добавленный ранее модуль delay.h, приводит к задержке выполнения на 0,5 секунды. Задержка реализована пустыми циклами микроконтроллера, причем нет необходимости заботиться об учете частоты тактирования микроконтроллера — текущая частота учитывается внутри библиотеки ASF после вызова функции sysclk_init().
Сборка с помощью системы автоматизации QBS
Чтобы получить исполняемый файл прошивки необходимо выполнить компиляцию довольно большого количества файлов. Фирма Atmel предлагает пользоваться файлами makefile, которые представляют собой инструкции компилятору GCC.
Автор же предлагает воспользоваться встроенной в Qt Creator средой автоматизации сборки QBS [1]. Для этого придется создать QBS файл проекта, содержащий сведения об исходных файлах, подлежащих компиляции.
Одним из преимуществ QBS является то, что нет необходимости вручную вносить название каждого файла с исходным кодом в QBS файл — достаточно указать каталоги размещения файлов, остальное система сделает сама.
Настройки компилятора в Atmel Studio 6 и отладка на симуляторе — грабли
Интересная, но, в общем, неудивительная вещь при отладке — возможно, кому-то пригодится.
Заметил, что при пошаговом выполнении программы оказываюсь в той функции, которая в этот момент (да и вообще в данной конфигурации программы) не вызывается. Причем оказываюсь не в начале функции, а где-то в середине. Заинтересовался — какого, собственно?
Настройки компилятора (оптимизация) были следующие:
— уровень оптимизации -O2
— галки стояли на «Pack structure members together (-fpack-struct)» и «Prepare functions for garbage collection (-ffunction-sections)»
Попробовал поиграться с уровнями оптимизации — без толку. Выключаю -ffunction-sections — всё нормально. А жаба душит, включение этой опции даёт уменьшение размера почти в два раза.
В хелпе написано следующее:
"-ffunction-sections: Prepare functions for garbage collection, if a function is never used, its memory will be scrapped"
То бишь, если функция нигде не используется, то под неё вроде бы память не выделяется. Оно и логично, сборка мусора и все такое.
То, что меня удивило: при включенной опции — при попадании программы в середину нигде не использующейся функции выхожу я из неё буквально на следующем шаге и туда, куда мне и надо. Посмотрел окно «disassembly» — там, куда я попадаю, Сишный текст строчки из НЕИСПОЛЬЗУЕМОЙ функции есть, а ассемблерные инструкции все как надо (там идет сброс флага и выход из ИСПОЛЬЗУЕМОЙ функции, в которую я заходил и как раз должен из неё выйти) Что за ерунда — так и не понял, может, кто точно знает и расскажет? В железе пока не пробовал, но судя по ассемблерному тексту, все должно работать правильно.
В общем, резюмирую — при отладке этой опцией компилятора надо пользоваться аккуратно, а лучше не пользоваться.
Да, чуть не забыл, при использовании -ffunction-sections в опциях линкера должно быть включено «Garbage collect unused sections (-Wl—gc-sections)», а то толку от использования -ffunction-sections не будет.
Для интересующихся, про настройки компилятора и линкера: Optimisations of AVR programs using avr-gcc