Программирование, радиоэлектроника,
саморазвитие и частичка из моей жизни здесь...

Настройка Geany в Linux для программирования AVR микроконтроллеров

Узнаем как настроить среду программирования Geany для разработки программ под AVR микроконтроллеры на языках C (Си) Assembler (Ассемблер). Кратко рассмотрим структуру команд для компиляции, сборки и прошивки программы в микроконтроллер.

Содержание:

  1. Подготовка
  2. Настройка Geany для AVR Ассемблера
  3. Настройка Geany для AVR Си
  4. Заключение

Подготовка

Думаю что для начала наиболее подходящей и простой средой для разработки под чипы 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, откроется окно с настройками для кнопок компиляции, сборки и выполнения. Заполним поля для команд как представлено на рисунке ниже:

Настройка Geany для AVR ASM

Рис. 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.

Делаем настройки как показано на рисунке ниже:

Geany AVR GCC настройки

Рис. 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.

Если статья оказалась полезной - помочь проекту можно тут: 👍 ПОМОЩЬ, 🎁 DONATE
Комментарии к публикации (12):
михаил #1михаил
02 Январь 2018 13:12

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
И что дальше?

0
ph0en1x #2ph0en1x
02 Январь 2018 15:41

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

Допустим что файл с исходным кодом называется "main.c", а проект с ним размещен в директории "/home/me/avrprojects/main".

Среда Geany перед выполнением следующей команды "avr-gcc -mmcu=atmega8 -Os %f -o %e.o" выполняет подстановку значений:

  1. %f - имя текущего файла с исходным кодом (путь отсутствует, расширение присутствует) "main.c";
  2. %e - имя текущего файла с исходным кодом (путь и расширение отсутствуют) "main".

Делаем подстановки и получаем следующую команду:

avr-gcc -mmcu=atmega8 -Os main.c -o main.o

Чтобы при выполнении этой команды программа avr-gcc смогла найти файл "main.c" (полный путь к нему не указан), нужно из консоли перейти в директорию где этот файл размещен (сделать директорию текущей, там же потом будет создан файл "main.o"):

cd /home/me/avrprojects/main

Теперь в том же окне консоли можно выполнить приведенную выше команду для компиляции кода - в папке должен появиться объектный файл "main.o".

Переходим к следующей команде: "avr-objcopy -j .text -j .data -O ihex %e.o %e.hex". Выполнив подстановки имен, среда Geany запустит ее в следующем виде:

avr-objcopy -j .text -j .data -O ihex main.o main.hex

Выполняем эту команду в том же окне терминала, в результате в директории проекта (где размещены "main.c" и "main.o") должен появиться файл "main.hex".

И в заключение, команда для прошивки через AVRDude: "avrdude -c usbasp -p m8 -P usb -U flash:w:%e.hex". Для данного проекта среда Geany запустит ее из текущей директории проекта в следующем виде:

avrdude -c usbasp -p m8 -P usb -U flash:w:main.hex

Теперь вам должно быть понятно как среда Geany запускает команды прописанные в меню "Build", как выполняет подстановки имен файлов для построения команд.

Важно заметить что для подстановки вместо "%f" и "%e" программа Geany берет имя текущего файла, который открыт в редакторе исходного кода на момент запуска команды сборки. Поэтому все нажатия кнопок для сборки проекта в Geany нужно выполнять не меняя текущий открытый в редакторе файл исходного кода (не меняя текущую открытую вкладку редактора).

Для работы с одним проектом вместо подстановок "%f" и "%e" можно прописать полные пути ко всем файлам. В таком случае, вместо использования имени файла с текущей открытой вкладки редактора, Geany будет использовать имена файлов с путями которые были указаны прямо в команде.

Для рассмотренного выше примера команды можно переписать вот так:

avr-gcc -mmcu=atmega8 -Os /home/me/avrprojects/main/main.c -o /home/me/avrprojects/main/main.o
avr-objcopy -j .text -j .data -O ihex /home/me/avrprojects/main/main.o /home/me/avrprojects/main/main.hex
avrdude -c usbasp -p m8 -P usb -U flash:w:/home/me/avrprojects/main/main.hex

Эти команды уже можно запускать из любого окна терминала, поскольку к файлам прописаны абсолютные пути, а расположение программ "avr-gcc", "avr-objcopy", "avrdude" операционная система знает уже изначально.

Если эти команды прописать в настройках меню "Build", то текущая открытая вкладка в редакторе уже не будет иметь никакого влияния на выполнение этих команд и подстановку значений имен (в этих командах уже нет подстановок).

Вооружившись пониманием того как это все работает, можно конструировать свои более сложные команды для сборки самых разных проектов, которые написаны на C, ASM, Python и других языках программирования. Можно заполнить пустые поля в настройках меню "Build" своими полезными командами (утилитами) для быстрого их вызова в процессе сборки и разработки проектов.

Geany поставляется с хорошим комплектом документации, для ее вызова достаточно нажать F1 или же выбрать в основном меню "Help" пункт "Help". Там можно найти описание подстановок "%d", "%e", "%f ", "%p", "%l" для настройки меню "Build", а также множество другой полезной информации.

0
михаил #3михаил
02 Январь 2018 17:14

У меня немного другое окошко "Сборка" - Compile и Build присутствуют, затем Lint(не знаю, первый раз вижу такую команду) затем "Собрать", "Собрать заданную цель...", "Собрать объектный файл", прописаны кирилицей.
Может avr-objcopy -j .text -j .data -O ihex %e.o %e.hex нужно прописАть в "Собрать объектный файл"? Сейчас попробую, если не получится, буду штудировать help.
Спасибо за советы.

0
Anton #4Anton
19 Март 2018 16:07

Доброго времени суток. В проекте имеется заголовок #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 путь к библиотеке заголовков?

0
ph0en1x #5ph0en1x
19 Март 2018 23:01

Здравствуйте.

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

Узнать с какими путями по умолчанию была скомпилирована программа avr-gcc можно запросив информацию о ее версии:

avr-gcc -v

Вот пример значений путей для программы avr-gcc версии 4.9.2 под операционной системой Debian 9:

--prefix=/usr/lib
--bindir=/usr/bin
--libexecdir=/usr/lib
--libdir=/usr/lib

Смотрим доступные ключи для запуска программы avr-gcc, вызываем встроенную справку:

avr-gcc --h

К использованию доступен ключ "--sysroot=":

--sysroot=  Use  as the root directory for headers and libraries

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

Таким образом, можете попробовать добавить в командную строку, в настройках Geany, свой путь для библиотек, вот пример:

avr-gcc --sysroot=/usr/avr/sys-root/ -mmcu=atmega8 -Os %f -o %e.o

Полезная информация по компиляции и настройке инструментов для AVR на разных операционных системах - http://www.nongnu.org/avr-libc/user-manual/install_tools.html

0
ph0en1x #6ph0en1x
20 Март 2018 20:09

Установил на скорую руку OpenSUSE Tumbleweed GNU/Linux в VirtualBox. Посмотрел какие доступны пакеты, имеющие отношение к AVR:

zypper search avr

Установил связку avr-libc + avrdude + cross-avr-gcc8 + cross-avr-binutils:

sudo zypper install avr-libc avrdude cross-avr-gcc8 cross-avr-binutils

Впечатлил размер скачиваемого cross-avr-gcc8 - примерно 1,2Гб.

При попытке скомпилировать какой-то файл с исходным кодом на языке Си, получил такую же ошибку как и у вас.

На одном из англоязычных форумов увидел пример использования опции "-I" для указания пути к директории с заголовочными файлами. Если посмотреть список всех доступных опций командной строки для GCC, то там указано что путь указанный в опции "-I" имеет более высокий приоритет чем системные пути для поиска заголовочных файлов.

Указав путь поиска заголовочных файлов с помощью опции "-I" проблема исчезла, файл скомпилировался:

avr-gcc -I /usr/avr/sys-root/include -mmcu=atmega8 -Os 1.c -o 1.o

Попробуйте исправить команду в настройках Geany, добавив "-I /usr/avr/sys-root/include" (только для OpenSUSE).

0
Anton #7Anton
20 Март 2018 22:50

Огромное спасибо за помощь. Скомпилировалось, но с таким предупреждением: /usr/lib64/gcc/avr/8/ld: warning: -z relro ignored.

0
ph0en1x #8ph0en1x
21 Март 2018 01:29

Предупреждение возникает в процессе компиляции при вызове программы-линкера "avr-ld" (из пакета avr-binutils), которая по умолчанию запускается, похоже что, с уже не поддерживаемой опцией '-z relro'.

RELRO (Relocation Read Only) - механизм защиты структуры исполняемого ELF-файла, о том как он работает можно почитать вот тут.

В avr-binutils версии 2.27,1 были внесены некоторые изменения по отношению к опциям для RELRO, а самая свежая версия сейчас - 2.30 (devel).

Не могу сказать можно ли полностью игнорировать это предупреждение, вероятно что со временем, после очередного обновления, оно исчезнет.

Сделал проброс программатора USBASP через USB-порт в VirtualBox где установлена OpenSUSE, скомпилировал простую программу на Си, прошил в микроконтроллер - работает.

0
plus24dbu #9plus24dbu
23 Апрель 2020 10:39

Чувак, ты реально крут!!! Читаю твои статьи - полезно всё!!! Хотя у меня и стаж по электронике 27 лет, но с огромным вниманием читаю статьи. Огромное спасибо, что ты не чмо, которое таит в себе зло, а человек, который делится полезной информацией!!!

0
ph0en1x #10ph0en1x
23 Апрель 2020 19:25

Приветствую! Стараюсь систематизировать разную полезную информацию, подавать ее в простом и доступном, по моему мнению, виде. Учитывая ваш отзыв, похоже что у меня это понемногу получается... Спасибо. Smile

0
Vlad #11Vlad
16 Апрель 2021 22:25

Нравится читать ваши статьи. Спасибо!

0
ph0en1x #12ph0en1x
18 Апрель 2021 14:58

Пожалуйста! Благодарю за ваше мнение, приятно это слышать.

0