Настройка Geany в Linux для программирования AVR микроконтроллеров
Узнаем как настроить среду программирования Geany для разработки программ под AVR микроконтроллеры на языках C (Си) Assembler (Ассемблер). Кратко рассмотрим структуру команд для компиляции, сборки и прошивки программы в микроконтроллер.
Содержание:
Подготовка
Думаю что для начала наиболее подходящей и простой средой для разработки под чипы AVR является Geany. Позже можно попробовать и другие программы, часть из которых была рассмотрена в предыдущей статье, и потом уже самому выбрать ту которая вам подходит больше всего. К тому же никто не мешает использовать несколько сред для разработки вместе, распределяя между ними задачи. Здесь выбор за вами!
Итак, вы уже установили Geany, перейдем к настройке данной среды для удобной разработки программ, но прежде разберемся с встроенным терминалом.
В прошлой статье на рисунке 2, где изображен скриншот Geany, снизу слева нет вкладки с названием "Terminal", если у вас также нет терминала то для появления возможности использовать терминал в Geany необходимо установить пакет libvte9:
sudo apt-get install libvte9
Дальше мы настроим среду Geany для удобной компиляции и прошивки микроконтроллера при программировании на языках C и Assembler.
Настройка Geany для AVR Ассемблера
Для улучшенной подсветки синтаксиса AVR Ассемблера выполним команду, которая скачает с оффициального сайта документации шаблон синтаксиса для asm-файлов и сохранит его в домашней директории с настройками для Geany:
wget http://wiki.geany.org/_export/code/config/avr_asm -O ~/.config/geany/filedefs/filetypes.asm
Откроем для редактирования в среде Geany какой-нибудь файл с расширением ".asm", можно создать пустой и открыть его. Теперь идем в меню Build - Set Build Commands, откроется окно с настройками для кнопок компиляции, сборки и выполнения. Заполним поля для команд как представлено на рисунке ниже:
Рис. 1. Настройка Geany для компиляции и прошивки микроконтроллеров используя язык AVR Assembler.
Здесь все просто, для каждой из кнопок мы указываем какие из команд нужно выполнять:
- avra --includepath /usr/share/avra/ "%f" - компилируем ASM файл, указав папку c INC-файлами для AVR чипов;
- avr-size %e.hex - смотрим статистику по размеру получившегося HEX-файла;
- avrdude -c usbasp -p m8 -P usb -U flash:w:%e.hex - прошиваем микроконтроллер ATmega8 (ключ -p m8) при помощи программы avrdude.
Сочетание символов "%f" - означает подстановку полного имени открытого файла (например my_program.c), а сочетание символов "%e" - подстановку только имени файла без расширения (например my_program).
Если у вас микроконтроллер другого типа то в команде прошивки для avrdude нужно указать соответствующий ключ -p (partno) с типом вашего микроконтроллера. Узнать значение опции для вашего микроконтроллера можно на страничке документации avrdude: http://www.nongnu.org/avrdude/user-manual/avrdude_4.html
В качестве программатора я использую USB ASP, поэтому если вы используете другой программатор то опция "-c usbasp" должна быть изменена. Список поддерживаемых программаторов и значений опций для avrdude приведены на справочной странице: http://www.nongnu.org/avrdude/user-manual/avrdude_12.html .
Более подробно программу avrdude, ее опции, а также использование с программаторами на онове COM или LPT порта мы рассмотрим в следующей статье. Пока что можете оставить все как есть, позже вы всегда сможете изменить настройки команд под любой тип программатора и микроконтроллера.
При компиляции для команды avra мы указывали путь к INC-файлам, что же это такое? - это файлы (расширение ".inc") с набором макросов и предопределений для конкретных моделей микроконтроллеров что нам будут необходимы в процессе написания наших программ на Ассемблере. Посмотреть список доступных файлов под разные модели чипов можно командой в консоли:
ls /usr/share/avra/
Для того чтобы результат прошивки микроконтроллера через avrdude при помощи кнопки Flash отображался во встроенном терминале нужно в настройках терминала Geany (Edit - Preferences - Terminal) установить галочку напротив пункта "Execute programs in the VTE".
Настройка Geany для AVR Си
С настройками для AVR-ассемблера мы разобрались, теперь сделаем настройки кнопок для компиляции, сборки и прошивки программы написанной на языке Си.
Откроем в Geany какой-либо файл с расширением ".c" для редактирования. Снова идем в настройки команд для сборки: меню Build - Set Build Commands.
Делаем настройки как показано на рисунке ниже:
Рис. 2. Настройка Geany для компиляции и прошивки AVR GCC.
Рассмотрим каждую из команд:
- avr-gcc -mmcu=atmega8 -Os %f -o %e.o - компилируем ".c" файл и получаем на выходе объектный файл с расширением".o";
- avr-objcopy -j .text -j .data -O ihex %e.o %e.hex - создаем на основе файла ".o" файл формата Intel HEX ".hex";
- avr-size %e.hex - смотрим статистику по размеру получившегося HEX-файла;
- avrdude -c usbasp -p m8 -P usb -U flash:w:%e.hex - прошиваем микроконтроллер ATmega8 (ключ -p m8) при помощи avrdude.
Здесь, как и в настройках для Ассемблера, не забываем что для avrdude нужно указать соответствующий ключ "-p" с типом используемого микроконтроллера, а также ключ "-c" с указанным после него типом используемого программатора. Где узнать имя МК и название программатора для использования в этих опциях avrdude было рассмотрено выше.
Кроме того, для компилятора avr-gcc нужно указать свой тип микроконтроллера, это делается при помощи ключа "-mmcu=atmega8". Список микроконтроллеров и их названия для использования в данной опции представлены на страничке документации по GCC: https://gcc.gnu.org/onlinedocs/gcc/AVR-Options.html
Заключение
В настройках Geany для кнопок Компиляция-Сборка-Запуск можно указывать не только команды но и скрипты с целыми списками команд на выполнение или же команды для работы с использованием Makefile. Все достаточно просто и удобно!
В следующей статье мы подробно рассмотрим программу avrdude, ее параметры и настройки, приведем примеры запуска программы для чтения и записи разных областей памяти микроконтроллера.
Начало цикла статей: Программирование AVR микроконтроллеров в Linux на языках Asembler и C.
avr-gcc -mmcu=atmega8 -Os %f -o %e.o в папке проекта создается файл main.o
avr-objcopy -j .text -j .data -O ihex %e.o %e.hex а здесь сообщается, что нет файла main.o
И что дальше?
Нужно постараться разобраться как все работает, попробовать выполнить команды для сборки, что установлены в настройках меню, через консоль, а потом проанализировав результаты попробовать отыскать причину ошибки.
Допустим что файл с исходным кодом называется "main.c", а проект с ним размещен в директории "/home/me/avrprojects/main".
Среда Geany перед выполнением следующей команды "avr-gcc -mmcu=atmega8 -Os %f -o %e.o" выполняет подстановку значений:
Делаем подстановки и получаем следующую команду:
Чтобы при выполнении этой команды программа avr-gcc смогла найти файл "main.c" (полный путь к нему не указан), нужно из консоли перейти в директорию где этот файл размещен (сделать директорию текущей, там же потом будет создан файл "main.o"):
Теперь в том же окне консоли можно выполнить приведенную выше команду для компиляции кода - в папке должен появиться объектный файл "main.o".
Переходим к следующей команде: "avr-objcopy -j .text -j .data -O ihex %e.o %e.hex". Выполнив подстановки имен, среда Geany запустит ее в следующем виде:
Выполняем эту команду в том же окне терминала, в результате в директории проекта (где размещены "main.c" и "main.o") должен появиться файл "main.hex".
И в заключение, команда для прошивки через AVRDude: "avrdude -c usbasp -p m8 -P usb -U flash:w:%e.hex". Для данного проекта среда Geany запустит ее из текущей директории проекта в следующем виде:
Теперь вам должно быть понятно как среда Geany запускает команды прописанные в меню "Build", как выполняет подстановки имен файлов для построения команд.
Важно заметить что для подстановки вместо "%f" и "%e" программа Geany берет имя текущего файла, который открыт в редакторе исходного кода на момент запуска команды сборки. Поэтому все нажатия кнопок для сборки проекта в Geany нужно выполнять не меняя текущий открытый в редакторе файл исходного кода (не меняя текущую открытую вкладку редактора).
Для работы с одним проектом вместо подстановок "%f" и "%e" можно прописать полные пути ко всем файлам. В таком случае, вместо использования имени файла с текущей открытой вкладки редактора, Geany будет использовать имена файлов с путями которые были указаны прямо в команде.
Для рассмотренного выше примера команды можно переписать вот так:
Эти команды уже можно запускать из любого окна терминала, поскольку к файлам прописаны абсолютные пути, а расположение программ "avr-gcc", "avr-objcopy", "avrdude" операционная система знает уже изначально.
Если эти команды прописать в настройках меню "Build", то текущая открытая вкладка в редакторе уже не будет иметь никакого влияния на выполнение этих команд и подстановку значений имен (в этих командах уже нет подстановок).
Вооружившись пониманием того как это все работает, можно конструировать свои более сложные команды для сборки самых разных проектов, которые написаны на C, ASM, Python и других языках программирования. Можно заполнить пустые поля в настройках меню "Build" своими полезными командами (утилитами) для быстрого их вызова в процессе сборки и разработки проектов.
Geany поставляется с хорошим комплектом документации, для ее вызова достаточно нажать F1 или же выбрать в основном меню "Help" пункт "Help". Там можно найти описание подстановок "%d", "%e", "%f ", "%p", "%l" для настройки меню "Build", а также множество другой полезной информации.
У меня немного другое окошко "Сборка" - Compile и Build присутствуют, затем Lint(не знаю, первый раз вижу такую команду) затем "Собрать", "Собрать заданную цель...", "Собрать объектный файл", прописаны кирилицей.
Может avr-objcopy -j .text -j .data -O ihex %e.o %e.hex нужно прописАть в "Собрать объектный файл"? Сейчас попробую, если не получится, буду штудировать help.
Спасибо за советы.
Доброго времени суток. В проекте имеется заголовок #include . После выполнения команды avr-gcc -mmcu=attiny13a -Os %f -o %e.o компилятор пишет: fatal error: avr/io.h: No such file or directory. Файлы заголовков находятся тут: /usr/avr/sys-root/include/ (здесь сам файл io.h: /usr/avr/sys-root/include/avr/io.h). Как "привинтить" файлы заголовков? Прописать что-то в команде, или указать где-то в Geany путь к библиотеке заголовков?
Здравствуйте.
Возможно у вас конфликтуют несколько различных инсталляций компилятора и библиотек.
Узнать с какими путями по умолчанию была скомпилирована программа avr-gcc можно запросив информацию о ее версии:
Вот пример значений путей для программы avr-gcc версии 4.9.2 под операционной системой Debian 9:
Смотрим доступные ключи для запуска программы avr-gcc, вызываем встроенную справку:
К использованию доступен ключ "--sysroot=":
Как следует из его описания, им можно указать корневую директорию для заголовочных файлов и библиотек.
Таким образом, можете попробовать добавить в командную строку, в настройках Geany, свой путь для библиотек, вот пример:
Полезная информация по компиляции и настройке инструментов для AVR на разных операционных системах - http://www.nongnu.org/avr-libc/user-manual/install_tools.html
Установил на скорую руку OpenSUSE Tumbleweed GNU/Linux в VirtualBox. Посмотрел какие доступны пакеты, имеющие отношение к AVR:
Установил связку avr-libc + avrdude + cross-avr-gcc8 + cross-avr-binutils:
Впечатлил размер скачиваемого cross-avr-gcc8 - примерно 1,2Гб.
При попытке скомпилировать какой-то файл с исходным кодом на языке Си, получил такую же ошибку как и у вас.
На одном из англоязычных форумов увидел пример использования опции "-I" для указания пути к директории с заголовочными файлами. Если посмотреть список всех доступных опций командной строки для GCC, то там указано что путь указанный в опции "-I" имеет более высокий приоритет чем системные пути для поиска заголовочных файлов.
Указав путь поиска заголовочных файлов с помощью опции "-I" проблема исчезла, файл скомпилировался:
Попробуйте исправить команду в настройках Geany, добавив "-I /usr/avr/sys-root/include" (только для OpenSUSE).
Огромное спасибо за помощь. Скомпилировалось, но с таким предупреждением: /usr/lib64/gcc/avr/8/ld: warning: -z relro ignored.
Предупреждение возникает в процессе компиляции при вызове программы-линкера "avr-ld" (из пакета avr-binutils), которая по умолчанию запускается, похоже что, с уже не поддерживаемой опцией '-z relro'.
RELRO (Relocation Read Only) - механизм защиты структуры исполняемого ELF-файла, о том как он работает можно почитать вот тут.
В avr-binutils версии 2.27,1 были внесены некоторые изменения по отношению к опциям для RELRO, а самая свежая версия сейчас - 2.30 (devel).
Не могу сказать можно ли полностью игнорировать это предупреждение, вероятно что со временем, после очередного обновления, оно исчезнет.
Сделал проброс программатора USBASP через USB-порт в VirtualBox где установлена OpenSUSE, скомпилировал простую программу на Си, прошил в микроконтроллер - работает.
Чувак, ты реально крут!!! Читаю твои статьи - полезно всё!!! Хотя у меня и стаж по электронике 27 лет, но с огромным вниманием читаю статьи. Огромное спасибо, что ты не чмо, которое таит в себе зло, а человек, который делится полезной информацией!!!
Приветствую! Стараюсь систематизировать разную полезную информацию, подавать ее в простом и доступном, по моему мнению, виде. Учитывая ваш отзыв, похоже что у меня это понемногу получается... Спасибо.
Нравится читать ваши статьи. Спасибо!
Пожалуйста! Благодарю за ваше мнение, приятно это слышать.