AVR toolchain своими рукамиPrint This Post

Автор Nikita Nazarenko
Опубликовано 13 Янв 2010 
Рубрики: AVR. Учебный курс
Метки: ,

DI HALT:
В догонку к прошлому посту про AVR Studio в Linux досылаю и про сборку avr-libc там же. Вынесено из комментов к предыдущему посту. Спасибо Dark SavanT

Если есть возможность поставить готовый тулчейн из пакета, лучше воспользоваться ей.
преимущество самосборного в том, что все что надо, лежит там где сказано и не засоряет /usr/*. Но тут мы теряем автоматические обновления из пакетов. Короче, думайте сами, решайте сами.

Поехали!
В минимальной комплектации нам понадобятся:

для того, чтобы это все безобразие собралось, нужен установленный в системе gcc, bash, awk, binutils, libc, может что-то еще забыл.

делаем каталог для сборки:

mkdir build
cd build

качаем исходники

wget -c http://ftp.gnu.org/gnu/binutils/binutils-2.20.tar.gz
wget -c http://ftp.gnu.org/gnu/gcc/gcc-4.4.2/gcc-4.4.2.tar.bz2
wget -c http://mirror.vocabbuilder.net/savannah/avr-libc/avr-libc-1.6.7.tar.bz2

поддиректории для сборки отдельных компонентов

mkdir build/binutils
mkdir build/gcc
mkdir build/libc 

распаковываем

tar zxvf binutils-2.20.tar.gz
tar jxvf avr-libc-1.6.7.tar.bz2
tar jxvf gcc-4.4.2.tar.bz2 

устанавливаем переменные окружения:
PREFIX - для того, чтобы make install скопировал бинарники в нужную директорию
PATH - для того, чтобы собрать libc компилятором для avr

export PREFIX=/opt/avrchain
export PATH=$PATH:$PREFIX/bin

Собираем binutils

cd build/binutils
../../configure --prefix=$PREFIX --target=avr --disable-nls
make install

Собираем gcc

cd ../gcc
../../gcc-4.4.2/configure --prefix=$PREFIX --target=avr --enable-languages=c --disable-nls --disable-libssp --with-dwarf2
make install

Собираем avr-libc

cd ../libc

../avr-libc-1.6.7/configure --prefix=$PREFIX --host=avr

make install

Проверим

[savant@savant-laptop avrchain]$ avr-gcc –version
avr-gcc (GCC) 4.4.2
Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

должны получить такой вывод.

А теперь что-нибудь соберем.
Я не запаривался и взял простой пример из AVR Курса

Вариант №1: все руками

Компилим:

avr-gcc -g -mmcu=atmega8 Pinboard_1.c -o demo.o

Линкуем:

avr-gcc -g -mmcu=atmega8 -o demo.out demo.o

Получаем .hex фаил для заливки в МК

avr-objcopy -j .text -O ihex ./demo.out demo.hex

Вариант №2: Makefile
создаем рядом с исходником Makefile такого вида:

CC=avr-gcc
OBJCOPY=avr-objcopy

CFLAGS=-g -mmcu=atmega8

all : demo.out
        $(OBJCOPY) -j .text -O ihex demo.out rom.hex

demo.out : demo.o
        $(CC) $(CFLAGS) -o demo.out -Wl,-Map,demo.map demo.o

demo.o :
        $(CC) $(CFLAGS) -Os -c Pinboard_1.c -o demo.o

далее говорим make и в итоге получаем hex фаил для заливки в контроллер. Как дальше жить, сами знаете, чай не маленькие, avrdude пользовать умеете.

Комментарии

20 комментариев на «AVR toolchain своими руками»


  1. lix 13 Янв 2010 11:26

    а как же патчи на gcc и binutils?

    Nikita Nazarenko

    Их густо, кучу вариаций приводить ИМХО бессмысленно. Тут задача показать как собрать toolchain и с его помощью собрать hex. для этого сгодится и ванильный gcc с binutils.


  2. bevice 13 Янв 2010 15:53

    >преимущество самосборного в том, что все что надо, лежит там где сказано и не засоряет /usr/*.
    Очень сомнительное преимущество. Современные пакетные менеджеры не только скачивают и распаковывают пакеты, но и решают проблему dependency hell, занимаются вопросами обновления.
    Весь цивилизованный мир давно отказался от пути make && make install (уже лет 5 не слышал подобной ереси). На любом Linux-форуме на такое предложения три шкуры спустят.
    Если хотите компилить сами - учитесь собирать пакеты под свой дистрибутив.

    Да, во всех известных мне дистрибутивах используются десятки патчей на GCC. И не потому, что патчить это модно - а потому, что они действительно нужны.

    Нет, это конешн личное дело каждого, но, имхо, не стоит рассказывать новичкам, не знающим debian-way (suse-way, your-distr-way, нужное подчеркнуть) как устроить у себя на машине бардак и dependency hell. Ведь есть дистрибутивный GCC, он лежит там где должен лежать, не верите — почитайте Filesystem Hierarchy Standard (FHS). И дистрибутивным GCC собирается вся система. Про бинутилс я вообще молчу.

    Nikita Nazarenko

    тут на любителя. Я себе для embedded разработки toolchain’ы собираю сам и кладу отдельно от основного дерева, в /opt, дабы они не засоряли собой /usr/* и не конфиликтовали(изредка бывает).

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

    насчет dependency hell - перечитать статью, смотреть префиксы и $PATH.

    Nikita Nazarenko

    опять же, первая строка статьи:
    [quote]
    Если есть возможность поставить готовый тулчейн из пакета, лучше воспользоваться ей.
    [/quote]

    gremlinable.livejournal.com

    По поводу “компилить сами”, ИМХО тут просто вопрос правильно выбора дистрибутива. В смысле, что для этого есть Gentoo, даже если не получается настроить сборку как тебе хочется USE флагами, то очень просто сделать локальный оверлей с теми параметрами, которые хочется =)

    Nikita Nazarenko

    ubuntu-way - в системе по умолчанию нет пакета build-essentials, его надо ставить отдельно.

    насчет сборки пакетов под дистр, да, это правильно, но мне в статье расписывать сборку под все стопиццот дистров какие только есть? make install универсален, а пуритане и сами догадаются себе собрать пакет.

    bevice

    ubuntu-way он же debian-way это сборка пакетов и установка dpkg. Как это делается рассказывается на соответствующих сайтах, и обсуждается на соответствующих форумах. Давайте не уходить в оффтопик


  3. and-blog.livejournal.com 13 Янв 2010 19:39

    Маленький косячёк в тексте:
    Собираем binutils
    cd build/binutils
    ../../configure –prefix=$PREFIX –target=avr –disable-nls
    надо:
    ../../binutils-2.20/configure –prefix=$PREFIX –target=avr –disable-nls

    и для сборки avr-libc надо:
    ../../avr-libc-1.6.7/configure –prefix=$PREFIX –host=avr

    Nikita Nazarenko

    да, так правильно. когда копировал с консоли, прокололся.

    Jael.Dace

    Не. Так надо:
    ../../binutils-2.20/./configure –prefix=$PREFIX –target=avr –disable-nls
    и
    ../../avr-libc-1.6.7/./configure –prefix=$PREFIX –host=avr
    )))


  4. Murav 13 Янв 2010 19:49

    Кстати, никто не подскажет, как пересобрать WinAVR из исходников?

    gremlinable.livejournal.com

    Ууу… я этим занимался пару недель назад - гемор ещё тот. В юнихах всё делается ГОРАЗДО проще, а под виндами столько плясок с бубном…
    А вообще, всё описано в мане по avr-libc - http://www.nongnu.org/avr-libc/user-manual/install_tools.html. Я собирал в MSYS, который, для удобства, запускал в Console.
    Если интересно подробнее - обращайтесь.


  5. igorkov 14 Янв 2010 1:41

    Собирал тулчейн для ARM-ов, под MinGW и MSYS, на удивление кроме нескольких мелочей проблем не возникло. Процесс сборки мало чем отличается от сборки под другие платформы. Здесь главное понять смысл, что в какой пакет входит и как используется.


  6. igorkov 14 Янв 2010 1:42

    Кстати, тут не упомянуто, но мне для начала потребовалось собрать зависимости GMP и MPRF, не совсем понял нафига они GCC вообще нужны. :-)

    Nikita Nazarenko

    судя по гуглу, gcc эти либы нужны для компилятора фортрана. Это странно.

    bevice

    Может быть стоит отключить все ненужное?
    GMP - вроде как библиотека увеличенной точности для работы с большими числами

    amaora

    Для обработки чисел в compile-time, упрощение выражений содержащих константы например, gmp и mpfr делают это одинаково на всех платформах, что и требуется. Кстати, теперь ещё и mpc для комплексных чисел надо похоже.

    igorkov

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

    Кстати, натыкался в каком-то компиляторе (если не ошибаюсь, Keil Realview MDK) на проблему, там в дефайне у меня значение выходило за 32бита, потом делилось и в итоговом приложении приравнивалось 32битной переменной. В итоге не работало, как оказалось, препроцессор в нем дефайны считал именно в 32х битных переменных и расчет производится неверно.


  7. alex_ac 15 Янв 2010 0:13

    при сборке gcc кроме как так у меня не получилось никак:
    tar -xvf gcc-4.4.2.tar.bz2
    cd gcc-4.4.2
    mkdir build
    cd build
    ../configure configure –prefix=$PREFIX –target=avr –enable-languages=”C,C++” –disable-nls
    make
    make install
    иначе при сборке был вылет с кучей ошибок.
    Ещё по хорошему следовало бы сделать коментарии к мэйкфайлу, но кому это надо в принципе сами найдут.

Оставьте свой отзыв

Вы должны войти, чтобы оставлять комментарии.


Материалы сайта являются авторскими. Копирование и публикация материалов без активной ссылки на первоисточник запрещено.

Реклама: