- Использование различных GCC тулчейнов для AVR
- Как скомпилировать и записать код на микросхему AVR в Linux / MacOSX / Windows?
- 1. Установка avr-gcc и инструментов
- Linux, Ubuntu
- Mac OSX
- Windows
- 2. Компиляция и запись кода
- Пример кода
- Компиляция
- Создание .HEX
- Программирование
- 3. Make и makefiles
- Резюме
- AVR-GCC 10.1.0 for Windows 32 and 64 bit
- Included tools
- Downloads
- Upgrading the Arduino IDE
- Known Issues
- Build Script
- History
Использование различных GCC тулчейнов для AVR
Написал давно, но что-то как-то не мог собраться и дописать. На фоне этого сообщения решил запостить, в общем выкладываю как есть.
Самый популярный gcc тулчейн для AVR микроконтроллеров является WinAVR. Но отнюдь не единственный в своем роде.
Итак:
— собственно WinAVR, ну про него много чего и так понаписано в интернетах, качественно и стабильно, но не часто обновляется.
На данный момент WinAVR 20100110 используется версия gcc 4.3.3
— от Atmel avr-toolchain-3.0.0.240 тут говорят старовата coreutils. По качеству и стабильности догоняет WinAVR. Версия gcc 4.4.3
— от klen’а с форума electronix.ru. Делает свои сборки под разные архитектуры с последними версиями gcc. Последняя версия с форума. Прямая ссылка kgp_avr_20100725.
Сам он говорит, что затачивает свои сборки на скорость исполнения и рекомендует использовать свои сборки только для экспериментов. Версия gcc 4.6.0
(new avr-kgp-elf-x86_32-20111121.7z Версия gcc 4.7.0)
— от Make Hack Void — http://www.makehackvoid.com из Австралии. Сборка MHV AVR Tools. Версия gcc 4.5.1
— также можно собрать свою сборку… (Тут многоточие, об этом можно много почитать в интернетах)
Для примера использования тулчейнов, возьмем простенький проект:
Сохраним его в файл simple.c и в папку «c:\avr_simple\»
Далее распакуем какой-нибудь из тулчейнов. В пути до исполняемых файлов тулчейна не должно быть пробелов и кириллических символов! То есть лучше всего распаковать (или установить) их в следующие папки:
Многие из тулчейнов не просто распаковываются, а устанавливаются в систему, при этом они модифицируют так называемую переменную окружения — Path.
Path находится следующим образом для win7:
Проще говоря Path — это те программы которые доступны всегда из командной строки, в какой бы директории вы не находились. В этой переменной окружения нужно оставить только один из avr-тулчейнов, например «c:\winavr\bin;», остальные нужно удалить, при этом не трогая ничего кроме avr-тулчейнов. Этот один оставшийся тулчейн будет работать по умолчанию как основной, если у нас не будет указано иного. Для того чтобы изменения в Path вступили в силу, нужно перезагрузиться.
Теперь можно скомпилировать файл simple.c, набрав в командной строке:
Программа будет скомпилирована тулчейном по умолчанию.
Далее, для того чтобы все эти (и не только эти) сборки заработали вместе и не мешали друг другу на компьютере, под управлением windows, понадобится как минимум MSYS (Minimal SYStem). MSYS это минимальное unix окружение, в которое входит утилита make, нужная для автоматизации сборки, и соответственно сам makefile проекта. Во многие сборки эта среда уже входит, например в winavr. Лично я использовал MSYS отсюда nuwen.net/mingw.html, вот прямая ссылка msys-6.3.7z (2.4 MB). Содержимое архива .7z распаковывается в c:\msys\. В папке появятся толпа .tar архивов, распаковываем в ту же папку, а архивы удаляем. Теперь в этой папке, c:\msys\, лежат папки bin\ etc\ и тд, а также msys.bat. Этот скрипт прописывает собственно msys в Path. Можно сделать это вручную, прописав в Path адрес куда msys положен, в нашем случае C:\msys\bin;. А вот makefile лучше всего иметь свой и копировать его из проекта в проект, а в начале скопировать его с кого-нибудь еще (например с меня), как я когда-то тоже его скопипастил.
Собственно makefile имеет следующую структуру:
— вначале объявление различных переменных
Например:
Дальше эту переменную, $(MCU), можно подставлять в другие:
А также дополнять переменные:
Если же объявить еще одну переменную с тем же названием, то верхняя видна уже не будет. Поэтому, частенько, когда забываешь поставить ‘+’, перед ‘=’, ничего не работает.
Соответственно в переменной SRC будет только hd44780.c, и при компиляции выскочит ошибка.
— далее идут цели.
(Важно! — Команды должны начинаться с символа Табуляции [Tab] )
Вот, в принципе, и все что нужно знать чтобы редактировать makefile’ы. Команда make, выполненная в директории, ищет makefile в этой директории и обрабатывает его.
Для того чтобы поменять тулчейн нужно поменять всего одну строчку в makefile, а дальше отработает скриптик скопипащенный мной с просторов форума electronix.ru.
В начале выбирается сам тулчейн, сюда можно добавить и свой.
Собственно сам исходник, который выбирает, выглядит так:
Как скомпилировать и записать код на микросхему AVR в Linux / MacOSX / Windows?
Это краткое руководство для начинающих, которое направлено на то, чтобы показать, как установить инструменты, скомпилировать код с помощью avr-gcc и отправить его в микроконтроллер с помощью avrdude.
Оно также знакомит с основами автоматизации этой задачи, помещая все инструкции в Makefile. Файлы примера ( main.c, main.bin, main.hex, Makefile) упакованы в архив который можно скачать по ссылке в конце данной статьи.
1. Установка avr-gcc и инструментов
Для компиляции исходного кода вашей прошивки на C и/или C ++ вам понадобится компилятор gcc-avr, библиотека C avr-libc и avrdude. Что очень полезно, существуют полные и простые в установке пакеты для всех основных платформ.
Linux, Ubuntu
Ubuntu предоставляет пакеты, поэтому вы можете просто установить их с помощью этой команды:
Mac OSX
Загрузите AVR MacPack. В образе диска MacPack есть установщик, который все сделает за вас.
Windows
Загрузите WinAVR, который включает в себя все необходимое и имеет хороший установщик.
2. Компиляция и запись кода
Теперь, когда у вас установлен компилятор, следующий шаг — скомпилировать простой исходный код в файл .BIN, затем сгенерировать файл Intel .HEX и, наконец, записать этот файл .HEX на микросхему AVR с помощью программатора для AVR.
Пример кода
Вот пример содержимого файла main.c. Код ничего не делает, кроме зацикливания в бесконечном цикле, но это для примера.
Компиляция
Приведенная ниже команда скомпилирует ваш код. Это GCC, поэтому я полагаю, что он вам знаком, и никакой дополнительной информации не требуется. Если вы хотите выполнить компиляцию для другого MCU, вам нужно указать соответствующую опцию -mmcu.
После успешной компиляции вы можете проверить размер памяти программы и данных с помощью этой команды:
AVR Memory Usage
—————-
Device: Unknown
Program: 40 bytes
(.text + .data + .bootloader)
Data: 0 bytes
(.data + .bss + .noinit)
Создание .HEX
Большинство программаторов не принимают в качестве входного файла исполняемый файл GNU. Поэтому нам нужно проделать некоторую работу.
Итак, следующий шаг — преобразование информационной формы .BIN в файл .HEX. Утилита GNU, которая делает это, называется avr-objcopy.
Программирование
Утилита под названием avrdude может программировать микропроцессоры, используя содержимое файлов .HEX, указанных в командной строке.
С помощью приведенной ниже команды файл main.hex будет записан во флэш-память. Параметр -p attiny13 позволяет avrdude узнать, что мы работаем с микроконтроллером ATtiny13. Другими словами — эта опция определяет устройство.
Полный список поддерживаемых чипов можно найти здесь. Обратите внимание, что также допустимо использовать и полные имена (т. е. t13 равно attiny13).
И вуаля! Чип запрограммирован.
3. Make и makefiles
Теперь мы можем автоматизировать этот процесс, создав Makefile и поместив туда наши команды. Структура Makefile очень проста, и дополнительную информацию о ней можно найти здесь . Утилита make автоматически считывает файл Makefile в папке, в которой вы ее запускаете. Взгляните на готовый пример:
Если вы запустите в терминале простую команду make , будет выполнена только метка «all». При запуске (sudo) make flash будет выполнена метка «flash» и так далее.
avr-gcc -std=c99 -Wall -g -Os -mmcu=attiny13 -DF_CPU=1200000 -I. -o main.bin main.c
avr-objcopy -j .text -j .data -O ihex main.bin main.hex
avrdude -p attiny13 -c usbasp -U flash:w:main.hex:i -F -P usb
avrdude: warning: cannot set sck period. please check for usbasp firmware update.
avrdude: AVR device initialized and ready to accept instructions
avrdude: Device signature = 0x1e9007
avrdude: NOTE: «flash» memory has been specified, an erase cycle will be performed
To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: warning: cannot set sck period. please check for usbasp firmware update.
avrdude: reading input file «main.hex»
avrdude: writing flash (40 bytes):
avrdude: 40 bytes of flash written
avrdude: verifying flash memory against main.hex:
avrdude: load data flash data from input file main.hex:
avrdude: input file main.hex contains 40 bytes
avrdude: reading on-chip flash data:
avrdude: verifying …
avrdude: 40 bytes of flash verified
avrdude: safemode: Fuses OK (H:FF, E:FF, L:6A)
avrdude done. Thank you.
Резюме
По сути, если предположить, что наша программа находится в main.c , только эти три вещи необходимы для компиляции и записи кода на чип AVR.
- $ avr-gcc -Wall -g -Os -mmcu=attiny13 -o main.bin main.c
- $ avr-objcopy -j .text -j .data -O ihex main.bin main.hex
- $ avrdude -p attiny13 -c usbasp -U flash:w:main.hex:i -F -P usb
Важно подчеркнуть, что мы можем легко автоматизировать весь процесс с помощью Makefiles. Рано или поздно она вам понадобится!
Скачать файлы примера (2,1 KiB, скачано: 94)
AVR-GCC 10.1.0 for Windows 32 and 64 bit
This is where I’ll be uploading builds of AVR-GCC for Windows 32 and 64 bit, which will also include Binutils, AVR-LibC, AVRDUDE, Make and GDB. I’ll be trying to keep the builds up to date with the latest tool releases when I can.
The binaries are built from source on a Debian 10 virtual machine with MinGW (GCC 9.1.0 and older were built on an Arch Linux VM), apart from AVRDUDE where the pre-built binaries are obtained from the official download area. Both 32 bit and 64 bit Windows binaries are provided. There’s probably no benefit from using the 64 bit stuff, but all the cool kids are doing it so why not.
A bash script for building AVR-GCC, AVR-Binutils, AVR-LibC and AVR-GDB from source is also provided below, making it super easy to build these tools for yourself.
Included tools
Tool | Version |
---|---|
GCC | 10.1.0 |
Binutils | 2.34 |
AVR-LibC | SVN with extras |
GDB | 9.2 |
AVRDUDE | 6.3 (Not included in Linux release) |
Make | 4.2.1 (Not included in Linux release) |
Downloads
Upgrading the Arduino IDE
Upgrading the Arduino IDE is pretty easy, though there could be some incompatibilities with certain libraries. Only tested with Arduino 1.8.13.
- Download and extract one of the downloads above
- Navigate to your Arduino IDE folder
- Go to [hardware/tools]
- Move the [avr] folder somewhere else, like to your desktop (renaming the folder won’t work, Arduino has some auto-detect thing which sometimes gets confused)
- Move the extracted folder from earlier to the [tools] folder and rename it to [avr]
- Copy [bin/avrdude.exe] and [builtin_tools_versions.txt] files and [etc] folder from the old [avr] folder to the new one
- Done! Open up the Arduino IDE, load up the Blink example, upload it to your Arduino and make sure the LED is blinking!
Known Issues
Build Script
This build script will install the required packages, create directories and build the tools from source. This should work on Debian 8+, Ubuntu 16.04+, CentOS 7 and maybe Arch.
Building takes about 1 hour 45 minutes on an Debian Linux virtual machine with 4 cores i5 2500K @ 4GHz and 2GB RAM.
History
2020-06-15
CURRENT RELEASE
AVR-GCC updated to 10.1.0
Binutils updated to 2.34
Added GDB 9.2
2019-09-07
AVR-GCC updated to 9.2.0
AVR-LibC updated to SVN with extras
2019-05-19
AVR-GCC updated to 9.1.0
2019-02-28
AVR-GCC updated to 8.3.0
Binutils updated to 2.32
2018-09-06
AVR-GCC updated to 8.2.0
Binutils updated to 2.31.1
Issues:
GCC 8 and binutils seem to be having some problems when dealing with library archives, you’ll get error messages like “unable to rename ‘core.a’; reason: File exists” when adding to library archives and “file not recognized: file truncated” linker errors.
2018-05-07
AVR-GCC updated to 8.1.0
Issues:
GCC 8 and binutils seem to be having some problems when dealing with library archives, you’ll get error messages like “unable to rename ‘core.a’; reason: File exists” when adding to library archives and “file not recognized: file truncated” linker errors.
2018-03-02
AVR-GCC updated to 7.3.0
Binutils updated to 2.30
Added Linux release
2017-08-22
AVR-GCC updated to 7.2.0
Binutils updated to 2.29
2017-07-09
AVR-GCC 7.1.0 (R3)
2017-07-09
AVR-GCC 7.1.0 (R2)
Issues:
This release was missing libwinpthread-1.dll in a second location
2017-05-23
AVR-GCC 7.1.0 Built
Issues:
This release was missing libwinpthread-1.dll
2016-04-30
AVR-GCC 6.1.0 Built
Issues:
When compiling with -ffunction-sections and any optimization level other than -O0, strings passed to a function will be stored in flash instead of RAM even though PSTR() hasn’t been used.
A work around is to the store the string in a variable then pass that to the function:
[More info here]
Another work around would be to add -fno-merge-constants to the compiler options.