В поисках альтернативы Atmel Studio

Atmel Studio and avr builder

Atmel Studio

Недавно вышла новая Atmel Studio версии 7.0. Как и все предыдущие IDE от Atmel, она не лишена ряда существенных недостатков:

  1. Отсутствие кроссплатформенности. Только Windows, причем, не ниже Windows 7
  2. Отсутствие поддержки популярных программаторов, JTAG-ов и т.д, только фирменные атмеловские инструменты
  3. Не умеет обновляться - каждую версию приходится ставить отдельно. Причем, если удалить предыдущую установленную версию, то может сломаться последняя.

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

Для сборки проекта студия использует утилиту make и генерит makefile. В принципе, makefile можно писать руками, но это не совсем удобно и очень громоздко. Попытки использования разных известные аналогов make (cmake, scons и прочее) желаемого результата также не дали. Хотелось своего велосипеда - чего-то предельно простого, гибкого и удобного. В качестве основы был выбран Python, т.к. его легко использовать не только в качестве языка для написания системы сборки, но и в качестве удобного языка для написания сценариев компиляции.

Утилита AVR builder

Пример простого проекта

Описание сценариев компиляции должно быть максимально простым - для сборки достаточно указать список исходных файлов, модель микроконтроллера и, как правило, его тактовую частоту. Так же хотелось иметь возможность собирать одной командой неограниченное множество различных прошивок (например, debug, release, прошивки для кварцевых резонаторов разных частот и т.д.)

Минимальный файл конфигурации выглядит так:


name = 'my_project'
src = ['src/*.c']
mcu = 'atmega8'
frequency = 16*1000000

Этот файл сохраняется под именем make.builder в корень проекта. Утилита при запуске читает этот файл, создает директорию build и запускает компиляцию всех файлов, указанных в списке src. В случае успеха будет создан файл прошивки build/my_project.hex. При этом нет необходимости явно перечислять все исходные файлы, можно использовать символ *. В данном примере, будут скомпилированы все файлы с расширениям .cиз директории src

Дополнительно в файле конфигурации можно указать параметры программатора (используется avrdude), набор макросов препроцессора и опции компиляции.

Более сложный пример


name = "my_project"
src = ["src/*.c", "src/lib/*.c", "src/*.s"]
mcu = "atmega8"
frequency = 16*1000000

# параметры вызова avrdude
port = "com1"
baudrate = 1200
programmer = "usbasp"

# макросы
defines = ['GLCD_DEVICE_AVR8', 'GLCD_CONTROLLER_PCD8544', 'GLCD_USE_AVR_DELAY', '__DELAY_BACKWARD_COMPATIBLE__']

# опции компилятора и сборщика
compiler_options = ['-Os']
linker_options = ['-Wl,--relax']


configurations = {
	"debug": {
		"name": "my_project_debug",
		"defines": ['DEBUG=1']
	},
	"release": {
		"name": "my_project_release",
		"defines": ['DEBUG=0', 'NDEBUG']
	},
	"demo": {
		"name": "my_project_demo",
		"defines": ['DEBUG=0', 'NDEBUG', 'DEMO_MODE']
	}
}

Тут дополнительно определены макросы препроцесора для условной компиляции (параметр defines) и настройки программатора для avrdude. Кроме того, в этом примере определены три конфигурации проекта с именами "debug", "release" и "demo".

Теперь скомпилированную прошивку можно залить на устройство командой


builder upload

При необходимости можно указать и параметры компиляции и сборки (параметры compiler_options и linker_options). По умолчанию билдер задает эти параметры так, чтобы на выходе получалась максимально компактная и оптимизированная прошивка. На моих примерах размер прошивки получался меньше, по сравнению с размером прошивки, собираемой Atmel Studio 7 для release-сборки с параметрами по умолчанию.

Поддержка разлличных конфигураций

Еще одна особенность утилиты - поддержка множества конфигураций. Их можно определять с помощью ассоциированного массива configurations, как это сделано в примере выше. Допустим, надо создать разные версии прошивок для разных устройств (с разной схемотехникой, частотой кварца, с разными возможностями и т.д.). Для этого добавляются секции конфигурации в которых определяются отличительные параметры сборки. Также для сборок можно настроить имя конечного hex-файла (параметр name). Списки препроцессорных констант из конфигурации (параметр defines) будут добавлены к общему списку.

Команда


builder all

соберёт все сборки и положит их в директорию build

Команда


builder release demo

соберёт только сборки release и demo

Команда


builder clean debug upload 

очистит содержимое каталога build, затем соберет сборку debug и запишет ее на устройство.

Если в конфигурации конкретной сборки определен параметр, который уже определен в общей конфигурации (например, параметр “name”), то его значение будет взято из параметров сборки если параметр не является массивом. В случае массива значение параметра будет взято из объединения массивов общих параметров с параметрами сборки.

Поддержка bootloader-ов

Если для обновлении прошивки предполагается использовать загрузчик, то, вместо того, чтобы каждый раз вручную "приклеивать" его к прошивке, можно указать в путь к его файлу параметром bootloader_hex:


  bootloader_hex = 'bootloader.hex'

В этом случае код загрузчика будет взят из файала с именем "bootloader.hex" и вставлен в собранный файл прошивки. По умолчанию загрузчик ищется в корневой директории проекта, но можно указать полный абсолютный или относительный пусть.

Другие платформы

Также можно добавить, что сборщик легко адаптировать для использования по другие микроконтроллеры и платформы. Например, удобно собирать разные тесты для запуска их на компьютере, либо полный компьютерный симулятор разрабатываемого устройства. Много дополнительного кода для этого писать не придётся, а разаботка сильно упрощается - отлаживать некоторые вещи на компьютере значительно проще, чем на устройстве - тут и с детальные логи сохранять не проблема, и перепрошивать каждый раз устройство не требуется.

Сейчас утилита умеет собирать проекты из исходников на С и ассемблере (файлы с расширением .S). Работоспособность проверялась под Mac OS X и Windows. Сборщик пытается автоматически определить местоположение исполняемых файлов avrgcc, и если у него это не получилось (или получилось плохо), то путь к компилятору можно определить в переменной среды AVR_GCC_HOME (должна указывать на директорию c исполняемыми файлами avr-gcc, avr-objcopy, avr-objdump, avr-size и avrdude).

Для компиляции обычного консольного приложения надо изменить тип компилятора на GCC:

compiler = 'gcc'

(по умолчанию compiler = 'avr')

Примеры использования сборщика можно посмотреть в следующих проектах:
https://github.com/trol73/avr-lcd-module-128x128
https://github.com/trol73/avr-ic-tester
https://github.com/trol73/avr-lamp-timer
https://github.com/trol73/avr-turnlight-relay

Выбор альтернативной IDE

Что же касается текстового редактора, то перепробовав разные варианты я остановился на IDE NetBeans. Из коробки она умеет работать с файлами Си и ассемблера, запускать сборку с отображением ошибок компиляции и возможностью перехода в строке файла с ошибкой. Так же NetBeans имеет средства рефакторинга - можно, например, переименовывать переменные и методы в исходниках. В итоге, по удобству работы NetBeans, как мне показалась, превосходит AtmelStuidio. Правда, при работе в Windows в последней версии NetBeans замечено некоторое количество некритичных но неприятных багов.

Netbeans IDE

Вообщем-то почти аналогичными возможностями из коробки обладает IDE Eclipse CDT. Но тут, как минимум, все хуже а ассемблерными файлами - подсветка синтаксиса примитивнее и нет возможности перемещаться по объектам как по ссылкам (по крайней мере, на момент написания статьи).

Еще можно использовать текстовые редакторы вроде Vim, Atom или Sublime, плагинизация которых позволяет получить вполне работоспособный инструмент, но это требует значительно большего количества времени и знаний. Лично мне наиболее простым показался Atom, в котором достаточно быстро удалось настроить сборку проекта с возможностью навигации по ошибкам/ворнингам и подсвечивания их в коде, но возможность рефакторинга отсутствовала.

Под Mac OS X достаточно удобным показался Xсode - тут из коробки для Си-проектов у меня заработало все кроме рефакторинга.

В качестве Makefile используется файл вида


all:
	python ~/bin/avr-builder/builder.py

Если Netbeans не находит каких-то утилит, то путь к ним можно прописать в файле (тут имя директории зависит от версии) /Applications/NetBeans/NetBeans 8.2.app/Contents/MacOS/netbeans. Я, например, добавил в самое начало этого файла строку


export PATH="/usr/local/sbin:$PATH:/Users/trol/bin"

Проект утилиты-сборщика можно скачать с гитхаба: https://github.com/trol73/avr-make

Рейтинг: 
0
Голосов еще нет