AVR toolchain своими руками

Распечатать

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

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

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

  • binutils — это ассемблер, линкер, objdump и еще куча необходимых для сборки бинарника вещей
  • gcc — собственно сам компилятор.
  • avr-libc — стандартная библиотека С для AVR архитектуры.
  • avrdude — программа для прошивки. Хальт про нее не раз писал.

для того, чтобы это все безобразие собралось, нужен установленный в системе 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 пользовать умеете.

Запись опубликована в рубрике AVR. Учебный курс с метками , . Добавьте в закладки постоянную ссылку.

25 комментариев: AVR toolchain своими руками

  1. lix говорит:

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

  2. bevice говорит:

    >преимущество самосборного в том, что все что надо, лежит там где сказано и не засоряет /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]

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

    • Nikita Nazarenko говорит:

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

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

      • bevice говорит:

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

  3. Маленький косячёк в тексте:
    Собираем 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

  4. Murav говорит:

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

  5. igorkov говорит:

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

  6. igorkov говорит:

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

    • Nikita Nazarenko говорит:

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

    • amaora говорит:

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

      • igorkov говорит:

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

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

  7. alex_ac говорит:

    при сборке 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
    иначе при сборке был вылет с кучей ошибок.
    Ещё по хорошему следовало бы сделать коментарии к мэйкфайлу, но кому это надо в принципе сами найдут.

  8. nsnd говорит:

    Здравствуйте. Собрал binutils, gcc, avr-libc. avr-gcc ругается на параметр -mmcu= или выдаёт
    /tmp/ccLilHLP.s: Assembler messages:
    /tmp/ccLilHLP.s:20: Error: too many memory references for `in’
    /tmp/ccLilHLP.s:21: Error: too many memory references for `in’
    /tmp/ccLilHLP.s:28: Error: no such instruction: `ldi r24,lo8(0)’
    /tmp/ccLilHLP.s:29: Error: no such instruction: `ldi r25,hi8(0)’

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

Добавить комментарий