Блог о Gentoo и около-линуксовым штукам

14 февраля 2016 г.

Crossdev окружение для AVR

18:43 Опубликовал Дмитрий Исаенко , , Нет комментариев
Сегодня хочется поговорить о том, как настроить crossdev окружение в Gentoo, которое необходимо для компиляции под микроконтроллеры AVR. По аналогичной схеме собираются тулчейны и для других популярных архитектур, к примеру MIPS или различных веток ARM.

Перед началом работы размаскируем последнюю версию crossdev и установим её:
# echo "sys-devel/crossdev ~amd64" >>  /etc/portage/package.accept_keywords
Теперь создадим и настроим отдельный оверлей, для пакетов crossdev.
# mkdir /usr/local/crossdev-overlay
# cd /usr/local/crossdev-overlay
# mkdir -p /usr/local/crossdev-overlay/{profiles,metadata}
# echo 'crossdevLocalOverlay' > profiles/repo_name
# vim metadata/layout.conf
masters = gentoo
thin-manifests = true
# chown  -R portage:portage /usr/local/crossdev-overlay
Также следует описать оверлей в repos.conf:
# vim /etc/portage/repos.conf/crossdev.conf
[crossdevLocalOverlay]
location = /usr/local/crossdev-overlay
priority = 10
masters = gentoo
auto-sync = no
Тут есть один важный нюанс. Если у нас в системе уже был один локальный оверлей, а для crossdev мы хотим использовать отдельный, то следует существующему оверлею назначить более высокий приоритет. Сделать это можно изменив его настройки там же, в директории repos.conf. В моём случае это выглядело так:
#echo 'priority = 13' >> /etc/portage/repos.conf/local.conf
Соберём окружение для AVR, явно указав версии необходимого нам ПО. У меня всё заработало со следующими параметрами GCC, binutils и libc:
USE="multilib -cxx" crossdev --g 4.6.2 --b 2.21.1-r1 --l 1.7.0 -S -s1 --target avr
USE="multilib cxx" crossdev --g 4.6.2 --b 2.21.1-r1 --l 1.7.0 -S -s4 --target avr 
Теперь нужно создать ссылку на ldscripts, иначе ничего не соберётся (эта проблема существует уже лет 6, но никто не шевелится её исправлять):
ln -s /usr/x86_64-pc-linux-gnu/avr/lib/ldscripts/ /usr/avr/lib/ldscripts
Осталось установить avrdude:
# emerge avrdude
Попробуем помирать диодиком на PC5:
# vim me.cpp
#define F_CPU 8000000L
#include <avr/io.h>
#include <util/delay.h>

void sleep(uint8_t millisec)
{
        while(millisec)
        {
              _delay_ms(1);
                millisec--;
        }
}

int main(void)
{
while (1) {

DDRC |=1<<PC5;
               PORTC &= ~(1<<PC5);
               sleep(100);

               PORTC |=(1<<PC5);
               sleep(100);
}
}
Теперь скомпилируем и прошьём (я использую программатрор от Thomas Fischl).
# avr-gcc  -O2 -mmcu=atmega8  me.cpp -o me.elf
# avr-objcopy -O ihex me.elf me.hex
# avrdude -c usbasp -p m8 -U hfuse:w:0xd9:m -U lfuse:w:0xe1:m
# avrdude -c usbasp -p m8 -U flash:w:me.hex:i
Вот и всё. Схему приводить тут не вижу смысла, но если кому интересно — смотрите на иконку к этой публикации. Удачи!


Полезные ссылки:
https://wiki.gentoo.org/wiki/Overlay/Local_overlay
http://gentoo-en.vfose.ru/wiki/Crossdev 

0 коммент.:

Отправить комментарий