Go Down

Topic: [Linux] Aggiornare la toolchain Avr (Read 48415 times) previous topic - next topic

leo72

Ho invece trovato una cosa interessantissima. Nel repo AUR, che è in pratica un repo contenente pacchetti preparati da utenti, ci sono i file PKGBUILD (che servono per compilare i pacchetti veri e propri) avr-libc, binutils-avr e avr-gcc con le patch Atmel!

Cerco di spiegare per chi non conosce Arch Linux. Questa distribuzione , accanto a pacchetti con binari precompilati, come Gentoo permette di compilare il software direttamente dai sorgenti con dei file PKGBUILD che contengono le istruzioni per la compilazione. Guardando dentro a questi PKGBUILD ho notato che l'autore ha fatto in pratica ciò che fa lo script scaricabile da AvrFreaks, cioè preleva i sorgenti, poi scarica le patch Atmel, le applica ed infine compila i pacchetti. Con in più la cosa che cercavo, ossia che venendo creato un pacchetto per il mio sistema, installo e disinstallo con 2 semplici comandi da terminale ed i file vanno dove devono andare, senza tanti sbattimenti. Ora, se le patch sono presenti nella loro totalità, i bug della toolchain dovrebbero essere risolti tutti....  XD

Ho terminato la compilazione. L'unico errore ricevuto è quello del file delay.h, che ho risolto però con la modifica di astrobeed. Ho provato la compilazione per tutte le board virtuali che ho, e cioè: Attinyx5, Attinyx4, Attiny2313, Atmega644/1284, Arduino, Luigino, Mega2560, Atmega168 standalone, Atmega328 standalone ed altre schede. E' andato tutto alla prima, senza intoppi. Lo sketch Blink uploadato sull'Arduino UNO funziona regolarmente senza problemi.

Potrei gridare EUREKA?  XD

brainbooster

Alla fine cel'hai fatta :) ai provato anche a compilare qualcosa con memoria oltre il "limite fatale"?

Maurotec

Quote
@leo mi posti il PKGBUILD, gcc, binutils, e avr-libc ? thks


Credo si tratti di questo https://aur.archlinux.org/packages.php?ID=57791

Se clicchi sul Tarball scarica tutto, mentre se clicchi su PKGBUILD ti mostra lo script di BUILD

@Leo
mi dispiace dirti che quel build delle avr-libc applica solo due delle patch presenti nel sito di atmel, tra l'altro credo che le patch sono già nel tar.gz che scarichi.

Le altre patch io le ho applicate, se vuoi puoi provare e sufficiente che scarichi le patch di atmel e le metti nella cartella dove risiede il build e ricompili, tutti i file che terminano con nome .patch verranno applicate come si vede da PKGBUIL.

Code: [Select]

for file in ${srcdir}/*.patch; do
    echo "Patching with $file"
    patch -p0 < $file
  done


se provi però incontrerai un errore di compilazione che ho risolto con una patch, fa sapere che te la spedisco.

Ciao.

leo72

@legacy:
come ti ha indicato Mauro, i PKGBUILD li trovi nel repo AUR. Per tua comodità te li ripropongo qui sotto:
avr-gcc-atmel
avr-libc-atmel
avt-binutils-atmel

@Mauro:
non ho controllato con accuratezza se scarica tutte le patch. Comunque non è un problema, se manca qualche patch. So costruire i file PKGBUILD per il repo di AUR, se manca qualcosa posso sistemarlo io e magari mettere online la versione corretta.
Ah, le patch non sono nel tar che scarichi. L'archivio contiene solo il PKGBUILD. Tutto viene tirato giù al momento della compilazione, a cominciare dai sorgenti.

@Brain:
non ho sketch al momento che occupino così tanta Flash.

leo72

@Mauro:
ho controllato il motivo per cui non sono presenti tutte le patch in avr-libc-atmel: perché sono patch per alcuni micro che non sono presenti nel resto della toolchain. Aggiungendo tali patch, ricevo poi errori in fase di compilazione, errori che il compilatore attribuisce proprio a questo:
Code: [Select]

configure.ac:1151: required file `avr/lib/avr35/attiny1634/Makefile.in' not found
configure.ac:1163: required file `avr/lib/avr4/atmega48pa/Makefile.in' not found
configure.ac:1186: required file `avr/lib/avr5/at90pwm161/Makefile.in' not found
configure.ac:1186: required file `avr/lib/avr5/atmega325pa/Makefile.in' not found
configure.ac:1186: required file `avr/lib/avr5/atmega3250pa/Makefile.in' not found
configure.ac:1186: required file `avr/lib/avr5/atmega3290pa/Makefile.in' not found
configure.ac:1303: required file `avr/lib/avrxmega2/atxmega32x1/Makefile.in' not found
configure.ac:1327: required file `avr/lib/avrxmega6/atxmega128b1/Makefile.in' not found
configure.ac:1327: required file `avr/lib/avrxmega6/atxmega256a3bu/Makefile.in' not found

A me comunque va bene così, in attesa di provare avr-gcc 4.7, che però ho nel ramo testing per cui disponibile sì ma con tutti i rischi del caso.

Maurotec

Si leo lo avevo scritto, questi micro sono presenti in avr-gcc e in avr-libc, mancano solo i makefile.am per compilare il codice.

Se non ti serve usare quei micro non devi appliccare quelle patch ovviamente, ma ricorda che in binutils e avr-gcc devono anche loro essere presenti, probabilmente gli altri build non includono questi micro per cui se devi aggiungerli devi applicare tutte le patch atmel per avr-gcc & company, e se lo fai ti ritrovi con questo intoppo.

Fai un fischio che ti, aspe che l'allego.

Ciao.

leo72

#96
Mar 27, 2012, 09:17 am Last Edit: Mar 27, 2012, 09:20 am by leo72 Reason: 1
Ora ricompilo con la tua patch. Vediamo che dice...  ;)

EDIT:
sì è incocciato  :smiley-sweat:

Code: [Select]
Making all in avr
make[3]: Entering directory `/home/leo/Documenti/Arch/ToolchainAvr/avr-libc-atmel/src/avr-libc-1.7.1/include/avr'
make[3]: *** Nessuna regola per generare l'obiettivo «io90pwm161.h», necessario per «all-am».  Stop.
make[3]: Leaving directory `/home/leo/Documenti/Arch/ToolchainAvr/avr-libc-atmel/src/avr-libc-1.7.1/include/avr'
make[2]: *** [all-recursive] Errore 1
make[2]: Leaving directory `/home/leo/Documenti/Arch/ToolchainAvr/avr-libc-atmel/src/avr-libc-1.7.1/include'
make[1]: *** [all-recursive] Errore 1
make[1]: Leaving directory `/home/leo/Documenti/Arch/ToolchainAvr/avr-libc-atmel/src/avr-libc-1.7.1'
make: *** [all] Errore 2
==> ERRORE: Si è verificato un errore in build().
    L'operazione sta per essere interrotta...

leo72

Ho riprovato ed ha compilato.... questa poi...  :smiley-eek:

Ora controllo che sia tutto a posto, però.

leo72

Se a qualcuno interessa, in allegato rimetto il tar.gz contenente il PKGBUILD modificato per compilare avr-libc che scarica ed applica tutte le patch Atmel per avr-libc, la patch di Mauro per modificare il makefile affinché compili per tutti i micro e la mia patch che modifica il file delay.h originale affinché l'IDE di Arduino non dia errore durante la compilazione degli sketch che usano le funzioni temporali.

Maurotec

Leo la patch per il delay vale per i soli utenti di Arduini Ide e core perchè correge un problema interno al core. Poi dovresti avere anche dei problemi nel compilare sketch che usano _delay_ms() e non mi spiego come mai non si verificano nel tuo caso, in pratica c'è una funzione alternativa per creare delay e questa richiede le funzioni fabs e ceil e nell'header delay.h non c'è include per math.h.

Ciao.

leo72

Sì, la patch vale solo per utenti di Arduino perché altrimenti dalla toolchain ci si aspetta quel file.

Sul fatto che non si verifichi quel bug non so. Stando a quanto aveva detto anche astro, ci voleva l'include di 2 librerie per far funzionare le funzioni temporali ma a me lavorano senza intoppi anche senza senza. Ho preso lo sketch Blink, che usa il delay, l'ho compilato senza errori e poi l'ho uploadato sulla mia UNO, e gira senza problemi, lampeggiando come deve.

leo72

#101
Apr 03, 2012, 10:30 pm Last Edit: Apr 03, 2012, 10:32 pm by leo72 Reason: 1
Sono emozionato... in Arch è arrivata la toolchain Avr con avr-gcc 4.7.0 nel repo del ramo stabile....  
Ora aggiorno e vediamo un po'....  

EDIT:
come non detto, l'emozione gioca brutti scherzi. E' la toolchain Gnu, non Avr, quindi gcc/binutils/glibc. Però è un buon segno, se è arrivato questo "blocco", il blocco Avr penso che sia di lì a venire, ormai. Attendo con impazienza  :D

leo72

Da qualche giorno è arrivata nei repo Arch la toolchain Avr aggiornata alla versione 4.7 di avr-gcc. Spinto dalla curiosità ho disinstallato la precedente toolchain Atmel e messa questa.

Errori:
1) delay.h
questo è l'ormai famoso errore riguardante le funzioni delay della toolchain che sono differenti da quelle presenti nel core Arduino. Si corregge editando il file /usr/avr/include/avr/delay.h e commentando la riga
Code: [Select]
#include <util/delay.h>

2) unknown name type: prog_uint8_t
questo errore compare su alcuni core (tipo il Tiny) che non hanno la definizione del tipo per la gestione con PROGMEM dell'unsigned char. Basta aprire il file pins_arduino.h contenuto in hardware/xxxx/core/xxxx (sostituire ad xxxx il core interessato, es.: tiny o 1284 o quel che è) e cambiare intorno alle righe 60-70 tutte le occorrenze di prog_uint8_t con
Code: [Select]
PROGMEM uint8_t

3) errore bastardo! error: attempt to use poisoned "SIG_USART1_RECV"
Questo errore viene fuori praticamente con tutti i core riguardanti i chip che hanno più di una seriale. Ciò è dovuto al fatto che in avr-libc 1.8 è stata inserita una lista di definizioni deprecate, che vengono messe "alla gogna" dal compilatore nel caso il flag _AVR_LIBC_DEPRECATED_ENABLE__ (come in avr-libc 1.8) risulti attivo.
Questa lista di definizioni deprecate comprende anche tutti i vettori delle seriali definiti con SIG_USARTx_RCV che, nella nuova versione, sono invece definiti con USARTx_RX_vect
Spippolando su internet ho trovato che un fix temporaneo è quello di editare il file HardwareSerial.cpp del core in uso e modificare le occorrenze così:
Code: [Select]
//#if defined(SIG_USART1_RECV)
#if defined(USART1_RX_vect)

(maggiori info qui)

Continuo il lavoro....

leo72

La cosa è un po' "pacco", nel senso che ho dovuto metter mano a tutti i file HardwareSerial.cpp e togliere tutte le occorrenze incriminate perché un semplice test #if defined() dava comunque l'errore visto che la definizione "avvelenata" non può essere in alcun modo toccata. La cosa positiva è che i vari core già erano predisposti perché c'erano nelle librerie i test per entrambe le definizioni.

Attualmente sembra che tutto funzioni. Adesso vorrei fare una prova con il famigerato bug dei 64kB. Ora ricerco lo sketch di astrobeed e lo compilo...

leo72


Attualmente sembra che tutto funzioni. Adesso vorrei fare una prova con il famigerato bug dei 64kB. Ora ricerco lo sketch di astrobeed e lo compilo...


Questa poi... ho caricato lo sketch, ho scelto Arduino Mega2560, ho cliccato su "compile" e mi è venuto fuori questo errore:
Quote
avr-gcc: error: unrecognized command line option '-assembler-with-cpp'

E da chi l'ha avuto quel parametro? Gliel'ha passato l'IDE? E perché sul Blink non l'ha passato?

Ora devo uscire (dentista + lavoro) non ho tempo per indagare, se qualcuno vuol fare qualche prova e far sapere qui cos'ha ottenuto, possiamo confrontare le gioie ed i dolori  :smiley-zipper:

Go Up