Avr simulator ide как пользоваться
В этом материале вы узнаете, как использовать AVR IDE для создания проектов, базовых схем и программирования ваших цепей.
Комплектующие
Микроконтроллеры AVR имеют некоторые преимущества по сравнению с другими аналогичными микросхемами, включая более высокую MIPS и более дружественную архитектуру. В этой статье мы узнаем, как использовать AVR IDE, как создать исполняемый проект, построить базовую схему AVR, а затем запрограммировать ее. Для этого нам понадобится набор компонентов, а также некоторое программное обеспечение.
Оборудование:
- ATMEGA168 DIP IC x 1
- Кварцевые резонаторы, кристалл (4-20 МГц) x 1
- 20 пФ конденсатор x 2
- 680 резистор x 1
- 5.6K резистор x 1
- Светодиод LED x 1
- Источник 5 В (цепь 7805, плавное регулирование и т.д.) x 1
- Провода
Программное обеспечение:
- USBASP
- WINAVR (20100110)
- Atmel Studio 7
Схема
Построение схемы довольно простое и может быть выполнено с использованием большинства методов построения схем, включая макет, картон, монтажную плату и печатную плату.
Схема в этом проекте показывает использование простой цепи регулятора мощности (с использованием 7805), которую обеспечивает устройство ATMEGA 5В, но оказывается, что программатор USBASP обеспечивает приблизительно 3,3 В. Несмотря на это, лучше обеспечить внешнее питание, чтобы USBASP не потреблял слишком много тока из любого USB-порта.
Программатор USBASP, который я купил, также шел с конвертером, который преобразует 10-контактный разъем в более удобный 6-контактный программный разъем. Тем не менее, header использует двухрядный шаг 2,54 мм, что означает, что он не может быть подключен к макету. Чтобы обойти это, я просто подключил разъем к проводам, которые соединяются с различными пинами на макете.
Как установить AVR Studio
Устройства AVR программируются с использованием специально модифицированной Visual Studio 2015 под названием AVR Studio 7, которую можно найти на сайте AVR. Первым шагом в программировании устройств AVR является скачивание установщика (небольшого приложения, которое загружает потом необходимые файлы). После скачивания нужно запустить установщик.
Первое, что он вас спросит, будет текст лицензионного соглашения и вопрос про отправку анонимной информации. Я лично рекомендую вам не отправлять анонимные данные по ряду причин (из-за крайней паранойи).
После выбора поддерживаемого устройства на следующей странице будет задан вопрос про расширения - Atmel Software Framework и примеры проектов. Убедитесь, что галочка стоит.
Следующая страница просто проверяет ваш компьютер на наличие потенциальных проблем, таких как отложенный перезапуск (из-за обновления), или если система не сможет запустить IDE. Если все проверено и ОК, жмите «Далее».
Если вы уже установили более раннюю версию AVR IDE, вы можете увидеть следующее окно. Если это так, просто нажмите «Установить».
Теперь нужно подождать пока IDE загрузит все необходимые компоненты и установит их.
После этого вам будет предложено запустить Atmel Studio 7.0. Убедитесь, что стоит галочка перед закрытием окна установки.
Как установить WINAVR
Хотя Atmel Studio 7 полезная штука для написания кода, она не самый лучший выбор, когда речь идет о программировании устройств AVR с использованием инструментов с открытым исходным кодом. Поэтому, чтобы сделать жизнь проще на этапе компиляции и/или программирования, мы будем использовать WINAVR, которая также поставляется с AVRDUDE для загрузки нашего кода на устройства Atmega. Чтобы скачать WINAVR для Windows, просто нажмите на эту ссылку и выберите исполняемый exe-файл.
После скачивания запустите установщик и просмотрите все предложенные опции, пока программа не спросит вас про место установки.
Лучшее место для установки WINAVR - это рекомендуемое расположение: C:\WinAVR-20100110 . Следующая опция спросит про компоненты и вы должны убедиться, что установлены все галочки (показано ниже).
После того, как кнопка установки нажата, установщик выполнит остальную часть работы, после чего установщик закроется.
Как подключить USBASP и установить драйвер для Windows
Если вы используете Windows, вам необходимо изменить драйвер USB для USBASP. Это сделать не сложно с помощью инструмента под названием Zadig. Проще говоря:
- загрузите Zadig,
- подключите устройство USBASP к компьютеру,
- дождитесь пока Windows автоматически установит USBASP,
- запустите Zadig,
- найдите устройство USBASP в раскрывающемся списке,
- выберите драйвер libusb-win32 (v1.2.6.0).
После того, как вы нажмете «Заменить драйвер» (или Переустановить драйвер), Zadig автоматически установит драйвер, необходимый для работы USBASP в Windows.
Как настроить Atmel Studio 7 и WinAVR
Atmel Studio 7 не будет изначально использовать WINAVR или AVRDUDE, поэтому мы должны настроить её для этого. Это может показаться пугающим, но не паникуйте; для программирования устройства AVRDUDE необходима только одна строка инструкций, и только один каталог требуется определить. Фактически, вы должны быть в состоянии скопировать и вставить код в этой статье для любого проекта на базе ATMEGA168.
Итак, первый шаг - сообщить Atmel Studio 7 какой компилятор она должна использовать. Для этого откройте Atmel Studio 7 (если она еще не открыта) и нажмите: Инструменты -> Параметры (англ.: Tools -> Options).
Предполагая, что вы установили WINAVR в папку по умолчанию на диске C и что у вас та же версия, что и в WINAVR, как в этой статье, во всплывающем окне мы пишем так, как показано ниже. После заполнения полей нажмите «Добавить» (англ. add), а когда вы вернетесь в предыдущее окно, нажмите «ОК».
Atmel Studio 7 теперь может использовать WINAVR для компиляции программ AVR, но все равно не может программировать устройства. Для этого нам нужно добавить внешний инструмент в Atmel Studio 7 и настроить его для устройства ATMEGA168.
Первый шаг - перейти в: Инструменты -> Внешние инструменты (англ. Tools -> External tools). Открывшееся окно - единственное окно, необходимое для работы программатора USBASP. Скрин ниже показывает большинство деталей, которые вам нужно будет заполнить.
Поле "Аргументы" (англ. Arguments) не полностью отображает всю информацию, которая необходима, и поэтому приведу ниже то, что было заполнено:
avrdude -c usbasp -p atmega168 -U lfuse:w:0x26:m -U flash:w:$(ProjectDir)Debug\$(TargetName).hex:i
Большая часть информации в этом не важна для нас, кроме двух фрагментов текста. Первый - это -p atmega168;, который говорит AVRDUDE, что мы программируем ATMEGA168. Если в вашем проекте используется другой чип, замените текст atmega168 на используемое вами устройство (например, atmega88).
Второй параметр -U lfuse:w:0x26:m, который специфичен для ATMEGA168. Эта инструкция указывает AVRDUDE настроить устройство на использование внешнего кристалла, и после программирования устройство будет работать только при подключении к схеме кристалла. Обратите внимание, что это также означает, что устройству требуется кристалл при программировании. Этот аргумент будет работать только для ATMEGA168.
Создание первого проекта
Следующая задача состоит в том, чтобы создать проект на основе AVR микроконтроллера и протестировать схему, компилятор и программатор.
Сначала перейдите в: Файл -> Создать -> Проект (англ. File -> New -> Project) и в открывшемся окне выберите: Исполняемый проект GCC C (англ. GCC C Executable Project), а в текстовом поле Имя (англ. Name) дайте любое название вашему проекту.
Следующее окно, которое должно появиться, - это окно выбора устройства. Из списка выберите Atmega168. Насколько мне известно, это окно не имеет никакого смысла, так как мы все равно передаем имя устройства в AVRDUDE вручную (пока я не могу найти способ заставить Atmel Studio 7 автоматически отправлять имя устройства в AVRDUDE через аргументы).
Результатом должен стать файл main.c, содержащий код нашей программы, который будет запускать AVR. Однако сгенерированный код ничего не делает, поэтому замените все содержимое файла main.c с помощью приведенной ниже программы (обязательно сохраните файл после ввода нового кода).
Теперь пришло время скомпилировать код и загрузить его на устройство AVR. Первый шаг - убедиться, что наш проект использует компилятор WINAVR. Щелкните правой кнопкой мыши проект и выберите «Дополнительно» (англ. - Advanced) в окне свойств.
В окне «Дополнительно» убедитесь, что в поле «Набор инструментов» (англ. - Toolchain Flavour) выбран WINAVR.
Это означает, что наш проект успешно скомпилирован и готов к передаче на наш чип. Чтобы запрограммировать устройство, убедитесь, что USBASP подключен как к ПК, так и к цепи Atmega, к цепи подано питание и что к микросхеме подключен кристалл (в случае, если микросхема была настроена для использования внешнего кристалла).
Затем, после всего этого, нажмите: Инструменты -> USBASP (англ. Tools -> USBASP), и все будет работать автоматически.
Если все хорошо, светодиод в вашей цепи должен начать мигать. Ниже приведен вывод AVRDUDE в Atmel Studio 7, показывающий, как выглядит успешная программа.
Заключение
Начало работы с устройствами AVR может показаться несколько сложным, если вы не используете официальный программатор, который может работать «из коробки» с Atmel Studio 7. Однако в инструментах программирования требуется определить только одну командную строку (тип устройства, биты и т.п.). И все будущие проекты могут использовать один и тот же инструмент/компилятор, который нужно настроить только один раз.
Т.е. следующий проект ATMEGA168, который вы будете делать, сможет использовать тот же компилятор и внешний инструмент, что и в этом проекте и не потребуется никаких дополнительных настроек. Конечно, в более сложных проектах может потребоваться замена бит (англ. fuse), например, но в данном материале я хотел просто помочь вам освоить работу с устройствами AVR.
В данной статье мы рассмотрим основные методики симуляции и тестирования прошивок для микроконтроллеров AVR.
Для чего нужно тестирование?
Любое тестирование программного обеспечения нужно в первую очередь для того, чтобы убедиться в работоспособности программы. Также тестирование обеспечивает проверку программы в целом и/или ее отдельных частей определённым требованиям. Тем не менее, пройденные тесты не гарантируют полного отсутствия ошибок в проекте, они лишь повышают вероятность их обнаружения на ранних этапах разработки.
Ошибка во время компиляции ничего не стоит. На этапе первичного тестирования она стоит времени разработчика. На стадии альфа- или бета-тестирования цена ошибки возрастает. Стоимость исправления ошибок, найденных после запуска продукта в серию, может перекрыть стоимость всего проекта. В лучшем случае придётся выпустить хотфикс (в hardware-проектах это не так-то просто), в худшем надо будет откатывать всю партию. Основной задачей тестирования является экономия средств и времени.
Сравнение тестирования в программных и аппаратных проектах
Программное тестирование проводится на стандартизированном «железе», зачастую на высоком уровне абстракции. Стандартное окружение и готовые фреймворки для тестирования позволяют добиться однозначных результатов тестирования вне зависимости от «железа», на котором продукт запускается.
В случае с тестированием микроконтроллеров (и «железных» проектов вообще) дела обстоят проще, но есть и свои сложности. Тестировать проще из-за того, что микроконтроллеры (МК) в основном предназначены для решения простых задач. Например, это может быть мигание светодиодами, опрос датчиков, несложная обработка данных, вывод на дисплей, коммуникация с периферийными модулями. Основная сложность в том, что окружение, где работает программа, зависит от модели и производителя контроллера. Микропрограмма работает на низком уровне. С учетом жестких требований к быстродействию, тестирование становится непростой задачей.
Какой способ тестирования выбрать в зависимости от задачи?
Существует три варианта запуска тестов для встраиваемых систем. Перечислим все:
- Запуск локально (на хостовой машине).
Преимущества: тесты быстро запускаются и отрабатывают, доступ к устройству не нужен.
Недостатки: ограниченная область тестирования, работать с внешней периферией не получится. Хорошим примером использования данного способа является тестирование не зависящего от платформы вычислительного алгоритма использующего данные с датчиков. Тестировать такой алгоритм с реальным источником данных было бы очень неудобно. Гораздо лучше подготовить набор данных заранее. Это можно сделать, используя небольшую программу-логгер на не обработанных данных с датчиков. - Запуск на симуляторе.
Преимущества: нет обязательных требований наличия самого устройства, возможность симуляции всего списка необходимой периферии.
Недостатки: ограниченная точность симуляции железа и окружающей среды, трудность создания и конфигурации такого симулятора. - Запуск на самом МК .
Преимущества: можно работать с периферией МК, прошивка будет отрабатывать так же, как в продакшне.
Недостатки: обязательный доступ к самому устройству, плюс цикл тестирования будет долгим из-за необходимости постоянно перепрошивать МК.
Следствие: очень тяжело добиться автоматизации тестирования.
В данной статье мы разберем первые два способа как наиболее перспективные для автоматизации.
Тестирование локально
Локальные тесты очень хорошо подходят для тестирования частей прошивки, не зависящих от окружения. Примерами могут быть любые вычислительные алгоритмы, различные контейнеры, списки, очереди, деревья, высокоуровневые протоколы обмена, конечные автоматы и др.
Рассмотрим пример проекта для микроконтроллеров AVR с возможностью локального тестирования платформо-независимых частей прошивки.
Тестирование прошивки, совместимой с МК AVR
Для МК AVR наиболее удобной и производительной средой разработки является Atmel Studio . К сожалению, данная среда не кроссплатформенна и доступна только для Windows.
Для большей наглядности я предпочел написать это проект вручную.
Пишу в VSCode на Ubuntu, для компиляции и линковки прошивки использую AVR GNU Toolchain , тесты и симулятор компилирую при помощи gcc . Процесс сборки проекта (компиляция, линковка, прошивка) осуществляется через утилиту make . Данный подход позволяет автоматизировать выполнение тестов и загрузку прошивки в целевую систему.
Для примера давайте рассмотрим прошивку для микроконтроллера Atmega1284 , реализующую функционал простого термометра.
Замер температуры происходит считыванием напряжения на делителе (в состав которого входит терморезистор), преобразования значения АЦП в температурные показатели и отображения на обычном 1602 ( hd44780 ) ЖК-экране.
Такой простой функционал общения с внутренней и внешней периферией сводится к оперированию регистрами микроконтроллера. Тем не менее, в прошивке имеется функционал, который необходимо протестировать (преобразование значений АЦП в температуру и вывод на дисплей).
Для компиляции вам потребуется AVR GNU Toolchain.
Структура проекта следующая:
Создать проект с тестами нужно так, чтобы его код можно было компилировать как под целевую систему, так и для кроссплатформенного использования — задача не простая. Необходимо использовать два компилятора, делая одни модули платформозависимыми, а другие — нет. Остановимся на main.c подробнее для наглядности.
При локальном тестировании в main.c создается 2 секции: для тестирования функционала и для реализации основного цикла программы.
Рассмотрим тестирование преобразования значений АЦП в температуру для последующего использования (файл src/tests/test.c) :
В данном примере нам достаточно указать заголовочный файл исходников тестируемого модуля и реализовать проверку операции конвертирования значений АЦП в температуру с заданной погрешностью.
Помимо написания тест-кейсов для Unity и указания пути к фреймворку, необходимо также добавить специальные директивы компилятора.
В нашем случае используется сравнение чисел с плавающей точкой повышенной точности. По умолчанию в фреймворке отключено тестирование типов double , для включения нужно добавить директивы:
После выполнения make tests , Ruby сгенерирует исполняемые файлы тестов, и произойдет их запуск.
Тестирование на симуляторе
В большинстве аппаратных проектов микроконтроллер используется для взаимодействия с внешней и внутренней периферией, поведение которой очень сложно а иногда и невозможно имитировать во время тестов. В решении данной проблемы очень помогают симуляторы целевых систем.
Для микроконтроллеров с архитектурой AVR существует несколько систем симуляции:
Atmel Studio — среда разработки под AVR-микроконтроллеры, о которой упоминалось ранее. (Сделана только под Windows.) Она содержит в себе встроенный симулятор почти всех моделей микроконтроллеров и удобный инструментарий для создания как внутренней, так и внешней периферии и управления ей. Недостатком является отсутствие кроссплатфоменности и громоздкость — автоматизировать проведение симуляции тяжело.
Simulavr — открытый кроссплатформенный проект на C/C++, предлагающий свои системы симуляции микроконтроллеров AVR. Присутствует несколько моделей микроконтроллеров, возможность писать скрипты отладки на Tcl/Tk и Python. Из недостатков стоит отметить сложный механизм добавления новых моделей МК в симулятор, скудную документацию и отсутствие поддержки проекта на протяжении нескольких лет.
simavr — относительно новый (и при этом довольно гибкий) кроссплатформенный проект для написания симуляторов МК AVR на C/C++. Из-за схожего названия его можно спутать с предыдущим инструментом, тем не менее, это совершенно разные проекты. В simavr есть большое количество моделей МК AVR, архитектура позволяет с легкостью добавлять новые устройства и модели. Присутствует интеграция с PlatformIO (расширение vscode для разработки встраиваемых систем), а также приведены понятные примеры использования инструмента с различными видами периферии. Недостатки: отсутствие описания сборки проектов, довольно не очевидная документация.
Я выбрал simavr как наиболее перспективный вариант.
Для начала использования simavr достаточно склонить репозиторий и собрать проект.
После успешной сборки можно проверить работоспособность симулятора, прогнав тесты или запустив примеры работы. Тесты находятся в директории tests , примеры работы с симулятором лежат в examples . Для запуска исполняемых файлов необходимо создать символьную ссылку на исходники в директории с прошивкой. К примеру, в директории tests:
создание символьной ссылки в папке simvar/tests и запуск теста:
В директории examples расположены папки с исходниками отладочных стендов (далее просто “стенды”) и файлами распространенных видов периферии микроконтроллеров. Для большего эффекта погружения можно запустить примеры с графикой — такие, как board_hd44780 , board_ssd1306 .
Simavr предоставляет широкий инструментарий для видов задач, которые перечислены ниже.
- Разработка собственных виртуальных отладочных стендов с микроконтроллерами и периферией.
- Создание виртуальных электронных компонентов.
- Управление поведением симуляции на временных отрезках вплоть до такта микроконтроллера.
- Подключение отладчика avr-gdb.
Полное описание возможностей симулятора можно найти в репозитории проекта.
Структурно любой симулятор на simavr представляет из себя исходники стенда, периферии, скомпилированную прошивку для микроконтроллера (кстати, в симулятор можно загружать ту же самую прошивку, что и в реальное устройство, изменения не требуются).
Для примера тестирования давайте рассмотрим тесты того же самого термометра, только с использованием симулятора (ветка simavr-testing).
Структура директории src/tests/sim:
Принципиальная схема виртуального стенда следующая:
Simavr имеет очень простую, хоть и не совсем очевидную структуру проектов.
Рассмотрим наиболее важные моменты имплементации отладочного стенда:
main_wrapper.c — обертка точки входа для прошивки. Позволяет предоставить компилятору и симулятору дополнительную информацию о прошивке, напряжении питания и других параметрах (полное описание всех параметров можно найти в simavr/simavr/sim/avr/avr_mcu_section.h )
adcToLcd.c — исходники самого стенда с периферией, описывающие манипуляции с портами передачи данных и оперирование временными интервалами между действиями периферии.
При инициализации прошивки стенд ищет указанный в firmware elf-файл, затем происходит создание МК и заливка прошивки.
Для инициализации и работы с дисплеем в директории parts располагаются исходники ЖК-экрана на контроллере hd44780 (для проекта я просто взял его из simavr/examples/parts и немного переписал функцию вывода данных с экрана на парсинг и возвращение double-значения).
Далее применяется функция подключения частей периферии к контроллеру setConnections , которая использует такие методы как:
— возвращает указатель на уникальный идентификатор PIN порта ввода-вывода, принимая при этом идентификатор контроллера, порт, PIN.
(Подробное описание см. в simavr/simavr/sim/sim_io.h)
— функция подключения одного PIN ввода-вывода(периферия или микроконтроллер) к другому.
пример использования:
— подключение PIN 4 на порту D микроконтроллера к PIN RS дисплея
Принудительно отправлять сигналы на порты ввода-вывода можно при помощи следующей функции:
— принимает собственно идентификатор порта и требуемое значение. value может принимать 1 либо 0 для цифровых входов, либо значение в милливольтах для аналоговых входов.
В simavr реализован удобный механизм установки времени на совершение внешних воздействий посредством регистрации таймеров, по срабатыванию которых выполняется привязанный обратный вызов.
Для регистрации таймера существует функция:
— на вход таймера принимается идентификатор контроллера, на котором требуется отсчитывать время в микросекундах (либо циклы), собственно время, через которое сработает таймер, обратный вызов, который при этом сработает, и его опциональные параметры.
В данном контексте обратный вызов выполняет функцию считывания вывода экрана, переключения на вывод АЦП следующего значения напряжения и регистрацию нового таймера. Для адекватного считывания информации с экрана посредством таймеров реализована задержка между считыванием — время ожидания до заполнения дисплея новыми данными.
Запуск каждого такта микроконтроллера выполняется функцией:
— такой механизм позволяет приостанавливать симуляцию на некоторое время для верификации данных или проведения вычислений. Он также служит механизмом запуска симулятора в отдельном потоке.
В нашем примере используется простая реализация с запуском симуляции в одном потоке, сбором результатов симуляции и проведением тестов собранных данных.
Чтобы не загромождать код при двух методиках тестирования, было принято решение вынести тест-кейс в отдельный файл adc-temp_test.c, который подключается к проекту как при компиляции тестов на Unity, так и при использовании симулятора.
Для компиляции и запуска симуляции достаточно внести в src/tests/sim/Makefile, в переменную $(SIMAVR) абсолютный путь к simavr и выполнить в директории src:
В отличие от модульных тестов, тесты с использованием симулятора (по сути это интеграционные тесты) позволяют полностью оценить правильность работы прошивки.
Ярким примером тестирования в нашем проекте является симуляция преобразования АЦП. Из-за ограничений разрядности АЦП она дает намного большую погрешность вычислении низких значений, чем выясняется во время модульных тестов.
При желании для больших проектов можно легко интегрировать симулятор с фреймворком Unity и автоматизировать процесс тестирования через CI/CD.
Запуск тестов на «железе»
Запуск тестов на «железе» в основном происходит в ручном режиме, с использованием систем внутрисхемной отладки — таких, как JTAG.
Для автоматизации тестов на «железе» приходится эмулировать поведение внешней периферии при помощи другого микроконтроллера. Появляются вопросы к адекватности поведения эмулированной периферии. При этом написание тестов часто перекрывает по затратам написание основной прошивки. В любом случае, такой подход обеспечивает максимальную точность и приближенность работы системы к реальным условиям. Описание методик подготовки тестов заслуживает отдельной статьи, и мы затронем эту тему в следующих публикациях.
Заключение
О тестировании прошивок можно рассказать ещё очень многое. Стандартной методики для тестирования прошивок встраиваемых систем не существует. Тем не менее, общие рекомендации при написании тестов и симуляторов для конкретных моделей микроконтроллеров AVR позволяют полностью автоматизировать процесс тестирования прошивок. Надеюсь, что данная статья помогла вам приобрести базовые знания о тестировании микроконтроллеров AVR.
@turbojedi Клаву хардварную была попытка сделать?
@001iz @Graveraider Всегда был вопрос а как у Evil персонажей могут быть романтики. Там скорее как в KoToR прогибание под свою сторону силы.
@Graveraider @001iz Q: Есть ли в игре романы? A: Да. Вы можете завести роман с 4 компаньонами, 2 из которых бисексуальны.
@001iz Заметки натуралиста, наплыв народу в комиксшопы вот произошел, после теории большого взрыва, где ненавязчиво подавалась идея что у задрота есть деньги, главное втереться к нему в доверие) Но только с хардкором тяжело.
Советуем посмотреть также Сайт Некроманта
Метки
Материалы распространяются на условиях лицензии GNU FDL
При работе с AVR многие начинают с прекрасного учебника от DiHALT , но хотя на linux можно запустить AVRStudio, давайте попробуем моделировать поведение микросхемы с помощью свободного проекта simulavr. Также на linux есть программы для внутрисхемной отладки с помощью JTAG (openOCD) но для них нужны дополнительно адаптеры.
О линуксе часто говорят как о конструкторе в котором можно работать с железками, наверное это верно. Но все мои знакомые из университета в большинстве своем подсаживаются на какую нибудь закрытую удобную среду, где много народа уже делало примеры и вообще mainstream
А вот как залезаешь под капот embended тусовки linux, сразу начинается: рытьё форумных сказаний на AVRFreaks и кусков документации.
Через терни к звездам.
Table of Contents
SimulAVR
Установка
Первое и главное это собрать simulavr и к сожалению по умолчанию в него много чего не включено ,причем не понятно зачем ведь тесты будут производится в основном на хост компьютере, в общем проще было бы ребятам все включить ,а конфигурационными опциями убирать то что не нравиться.
Требования
- gcc
- autoconf
- zlib-dev
- libtool
- swig (для python интерфейса)
- avr-gcc
- avr-gdb
- avr-libc
- tk-*-dev (для TCL интерфейса но я не видел примеры его использования)
- tk-dev
- xotcl-shells
- itcl
У меня не захотел компилироваться тарбол поэтому я стянул свежую и исправленную версию с git хранилища.
Посмотрим список доступных переменных для конфигурации
Самое время озаботиться поддержкой Verilog ,Python и это весьма геморройный пунктик, например на Ubuntu 13.04 он не смог найти пути к python библиотекам, вот так можно их указать вручную.
Правим код!
Странно , почему у них там по умолчанию залочена возможность менять значение PIN-ов portToggleFeature=False , поэтому глобально менять ничего не стал.
Подготовка (компиляция)
Итак у нас есть некий файл с кодом на ассемблере и нам необходимо его отладить с помощью gdb.
Смотрим справку и видим:
Запуск
Что здесь написано:
Что мы сделали, подключились к удаленному серверу gdb , load загрузили туда нашу программу, поставили точку останова на метке waitstart и начали выполнение программы вплоть до точки останова continue. Пошаговое выполнение производиться командой next или n (где мы не входим в вызываемы функции) или step где мы переходим в вызываемые функции.
У меня в Emacs GUD отображаются изменение всех регистров, в консольном режиме info registers поможет рассмотреть состояние всех регистров. Но к сожалению там нет портов, поэтому смотрим даташит(спецификацию) на Atmega16 и узнаем что PORTD обладает адресом 0x32, DDRD=0x31,а PIND=0x30.
Как это посмотреть и поменять в пошаговом режиме.
Код примера, на нем сразу видно на что были заменены директивы Atmel Assemblera.
Прерывания
Пример кода с прерыванием INT0, к сожалению оно автоматически не срабатывает при изменение значения указанного пина, через регистры, поэтому вызваем его напрямую с помощью команды
Номер вектора можно узнать из даташита к контроллеру(номер N-1 так как первое прерывание это reset, так для INT0 это 1), в программе же представлены стандартные для препроцессора C имена. (Смотри Note 7)
Исходный код с кодом для тестирования. Вопросы разработчиком я отослал и вообще посоветовал им wiki завести,но ответа пока нет.
Вспомогательные инструменты
Emacs GUD
Позже выложу видео о том как работать во всем этот великолепии.
Makefile и gdbinit
Красивый Makefile для embended проекта там создается инициализационный файл для gdb который убирает в себя рутинные операции.
Т.е. теперь запуская GDB командой avr-gdb -x имя\_файла\_gdbinit
Это только первые и робкие примеры и шаги в этом направления, я ничего не сказал о DDD а также о том как можно раздуть конфиг к GDB до 4000 строк. Это постараемся добавить сюда по мере освоения.
В продолжении статьи "Программирование для AVR в Linux", мы расскажем, как осуществлять отладку микроконтроллеров семейства Atmel AVR в Linux, используя симулятор и интерфейс JTAG. Будем исходить из того, что мы используем дистрибутив, основанный на Debian (Ubuntu) и у нас есть все необходимые программные пакеты, которые мы установили, руководствуясь вышеупомянутой статьей (gcc-avr binutils-avr avr-libc avrdude gdb-avr avarice simulavr). Отладку будем производить в интегрированной среде разработке Eclipse с установленным AVR Eclipse Plugin. Эта статья, так же как и предыдущая адресуется начинающим пользователям Linux и начинающим разработчикам ПО для микроконтроллеров.
Для отладки мы будем использовать GNU Debugger (gdb), а точнее его модифицированную версию avr-gdb (бинарный файл avr-gdb мы получили, установив пакет gdb-avr). Этот отладчик умеет работать с удаленным сервером по TCP-соединению, именно так осуществляется удаленная отладка на платформах, отличных от платформы разработчика (например, так отлаживают программы для ARM-устройств). Клиентская часть отладчика общается с сервером, отсылая ему команды на чтение данных, установку точек остановки и т.п.
Мы, конечно не сможем установить gdb-server на микроконтроллер, но инструменты отладки, которые мы будем использовать, как раз умеют притворяться удаленным gdb-сервером. Именно так работает симулятор simulavr и утилита avarice, которая общается с микроконтроллером через интерфейс JTAG и реализует gdb-сервер для общения со стандартным отладчиком gdb. Так как эти утилиты реализуют удаленный сервер, то мы можем запускать их не только на локальной машине, но и на любой другой машине в сети. Полагаем, пока нам это не особо нужно и мы запустим все на своей машине. Нам нужно будет знать два параметра после запуска gdb-сервера - сетевой адрес (в нашем случае - localhost) и номер порта (выберем любой незанятый адрес из диапазона 1024-65535 и зададим этот номер порта в качестве параметра при запуске simulavr или avarice).
Для отладки нам понадобиться скомпилировать исходники с опцией -g, чтобы добавить в elf-файл отладочную информацию. Настраивая Eclipse (см. предыдущую статью), мы указали такую опцию для компилятора GCC.
Для начала попробуем запустить симулятор - никакого железа нам не понадобится, мы сможем познакомится с процессом отладки и заодно узнаем о недостатках отладки с симулятором.
Отладка с помощью симулятора
Симулятор - это программа, которая притворяется микроконтроллером. Таким образом, мы можем отлаживать нашу программу, загрузив ее в симулятор, не имея при этом макетной платы, микроконтроллера и программатора. Кроме того, для микроконтроллеров, не поддерживающих JTAG, о котором будет рассказано ниже, использование симулятора - это единственный способ, который дает возможность, не прибегая к модификации кода, выполнить программу с точками останова, пошагово, копаясь по пути в содержимом регистров и переменных.
Запустим simulavr в качестве gdb-сервера (опция -g), слушающего порт 1200 (-p 1200), в режиме микроконтроллера ATMega8 (-d atmega8), работающего на частоте 8 МГц (-c 8000000) и заставим его отображать содержимое регистров внешней программой simulavr-disp, которая установилась вместе с пакетоми simulavr (опция -P simulavr-disp):
simulavr -g -p 1200 -d atmega8 -c 8000000 -P simulavr-disp
Waiting on port 1200 for gdb client to connect.
Мы видим, что программа ожидает соединение клиентской части отладчика на порту 1200 и еще мы видим, что открылось окно, отображающее значение регистров общего назначения и регистров ввода-вывода.
Мы могли бы теперь открыть еще одно окно виртуального терминала, запустить в нем отладчик avr-gdb, ввести команды чтения elf-файла, адрес и порт gdb-сервера (localhost:1200), команду load и отлаживаться, задавая вручную точки остановок и выводя на печать значения переменных, но нам будет намного удобнее отлаживаться в IDE. Настроим Eclipse для работы с симулятором.
Настройка IDE Eclipse для отладки с simulavr
Сконфигурируем инструмент отладки:
Run -> Debug configurations.
В левой части окна кликнем правой кнопкой мыши на пункте "GDB Hardware Debugging" и создадим новую конфигурацию (New. ). Первым делом укажем имя для новой конфигурации (поле "Name"). Придумаем что-то, понятное для нас (например, simulavr-test).
На вкладке Main введем в поле "Project" нужный проект, в поле "C/C++ Application" укажем путь elf-файлу, проще всего воспольтзоваться кнопкой Search Project.
На вкладке Debugger в поле "GDB Command" впишем полный путь к клиенту отладчика: /usr/bin/avr-gdb. Отметим чекбокс "Use remote target", установим пункт "JTAG Device" в "Generic TCP/IP", укажем ниже адрес и порт сервера отладки (localhost, 1200).
Перейдем ко вкладке Startup и найдем там секцию "Runtime Options". Установим чекбокс напротив "Set breakpoint at" и введем значении функции: main. Установим чекбокс напротив "Resume". При отладке программа остановится при входе в функции main и мы сможем пройти ее пошагово или ввести дополнительные точки остановки и запустить программу до первой из них.
На этом конфигурирование отладки можно закончить, закроем окно Debug Configurations и нажмем на стрелочке рядом с кнопкой отладки (изображение жука), выбрав "Organize Favorites. ". Отметим галочкой только что созданную конфигурацию simulavr-test.
В отдельном окне терминала у нас уже запущен simulavr на нужном нам порту, поэтому теперь мы выделяем в Eclipse наш проект и запускаем отладку, выбрав из списка "simulavr-test" под кнопкой отладки.
Eclipse запустит avr-gdb, загрузит elf-файл и предложит открыть набор инструментов ("перспективу") для отладки. После этого у нас окажутся под рукой вкладки с исходным кодом, значениями локальных переменных, списком точек остановки, значениями регистров общего назначения, вкладку Expressions, где мы сможем добавлять Си-выражения и отслеживать их значение в разных точках программы. На вкладке с исходным кодом мы сможем устанавливать и удалять точки остановки, а в верхней панели найдем кнопки для управления ходом выполнения программы, в том числе для пошагового выполнения программы.
Попробуйте поиграться с точками остановки, которые могут быть безусловными и с заданными условиями. Попробуйте пройти программу пошагово, выполнить ее до следующей точки остановки, узнать значение переменной или выражения в нужном месте программы.
Обратите внимание на то, что на вкладке регистров мы видим только содержимое регистров общего назначения, но, к сожалению, не видим регистров ввода-вывода. Кроме того, мы не сможем указать в выражении что-то типа "PORTB". Поэтому для того, чтобы просмотреть содержимое регистра ввода-вывода нам придется создать переменную и присвоить ей в нужном месте содержимое регистра. Но, если вы еще не забыли, у нас есть запущенное симулятором окно с программой simulavr-disp, в котором мы видим все регистры - можно пользоваться им.
Чтобы не запускать каждый раз симулятор из командной строки, сконфигурируем Eclipse для запуска simulavr:
Run -> External Tools -> External Tools Configuration.
В левой части окна жмем правой клавишей мыши на пункте "Program", "New. ". Придумаем имя, например "ATMega8 8MHz localhost:1200".
На вкладке Main, в поле "Location" укажем полный путь к симулятору: /usr/bin/simulavr. В поле "Arguments" - параметры вызова: -g -p 1200 -d atmega8 -c 8000000 -P simulavr-disp.
На вкладке Build снимем галочку с пункта "Build before launch", иначе симулятор не запустится, если при компиляции будут выданы предупреждения.
На вкладке Common, в разделе "Display in favorites menu" установим галочку напротив "External Tools".
Теперь у нас все готово для комфортнорй работы. Перед первым запуском сеанса отладки запускаем симулятор, выбрав в под кнопкой внешних инструментов, в выпадающем списке только что созданную конфигурацию "ATMega8 8MHz localhost:1200". Потом под кнопкой отладки выбираем конфигурацию отладки ("simulavr-test") и переходим к отладке.
По окончании отладки процесс симулятора будет оставаться в фоне, снова запускать его не нужно. Если нам нужно отлаживать несколько проектов для разных устройств, создаем несколько конфигураций в External Tools и соответствующих им конфигураций отладки, развесив каждый вызов симулятора на разные порты.
Отладка с помощью JTAG
Интерфейс JTAG позволяет осуществлять отладку непосредственно внутри микроконтроллера, без модификации кода. Здесь тоже есть некоторые ограничения: потребуется занять некоторые выводы микроконтроллера, кроме того, не все микроконтроллеры поддерживают JTAG.
У нас в офисе нашелся AVR-JTAG-USB от Olimex. Мы скачали с сайта производителя даташит к этому устройству, посмотрели его распиновку и без труда соединили с микроконтроллером на макетной плате.
Нам нужно определить, как будет представлено это устройство в каталоге /dev после подключения его к разъему USB. Сравним листинг каталога до и после включения устройства:
Допустим, мы обнаружили, что появилось устройство ttyUSB1. Теперь нужно запустить в терминале утилиту avarice с нужными параметрами, чтобы получить gdb-сервер, который будет общаться с микроконтроллером чере JTAG (заставим его слушать порт 1201):
avarice -j /dev/ttyUSB1 -B 1000 -P atmega16 -d localhost:1201
Теперь настроим Eclipse:
Run -> Debug configurations.
Создаем новую конфигурацию в разделе "GDB Hardware Debugging" и задаем ей имя, к примеру, "JTAG-test". Выполним все оставшиеся шаги по настройке конфигурации точно так же, как мы это делали для конфигурации отладки "simulavr-test", у нас изменится только номер порта gdb-сервера. В заключении перейдем на вкладку Debugger и выберем "Standard GDB Hardware Debugging Launcher" по ссылке в самом низу окна. После этого в разделе "GDB Setup" на этой же вкладке появится два дополнительных полях, установим значения в них: "Command Set" -> "Standard", "Protocol Version" -> "mi2".
/usr/bin/avaraice
Мы рассмотрели вкратце настройку инструментов отладки на примере IDE Eclipse. В Linux есть и другие визуальные среды отладки, которые могут работать с исходным кодом и отладчиком GDB, можно попробовать avr-gdbtui (утилита в составе пакета gdb-avr), утилита ddd (ставится отдельным пакетом), и др.
Читайте также: