[WIN] Aggiornam. compilatore IDE 0022-0023-1.0 all'ULTIMA VERSIONE ATMEL

OK, tanto devo fare una prova di installazione, ci metto niente a verificarlo. A dopo.

@Menniti:
se compilando con l'IDE 1.0 ti esce fuori l'errore sull'arduino.h vuol dire che stai usando uno sketch che richiama una libreria non compatibile con l'IDE 1.0

@tutti:
Per dovere di cronaca vi riporto il mio intero periodo, non la singola frase:

Con le versioni successive alla 4.3.5 lo sketch ArduinoISP viene compilato NON funzionante. Con le versioni 4.5.x ci sono i problemi legati al famoso bug del delay, che non funziona per via di una errata inizializzazione dei registri se non si mette una dichiarazione di una variabile globale all'inizio dello sketch. Sulle versioni 4.6.x c'è il problema che alcune lib del core che contengono diciture non più riconosciute (non mi ricordo esattamente quali ma mi pare che siano dei tipi di dati) e vanno modificate per farle funzionare, poi con le versioni ancora più recenti compare il problema di dover aggiornare anche binutils-avr, ed anch'esso ha i suoi czz e mazzi.

L'affermazione non si riferisce tanto a Linux o Windows quanto al tipo di toolchain usata.
Se usate la toolchain 4.3.5 non patchata c'è per tutti il bug del limite dei 64 kB, se ne è discusso ampiamente. E' proprio da un post di Mike che la questione è venuta fuori.

Quindi Linux o Windows o Mac, uno sketch che indirizza dati oltre quella soglia è destinato a fallire.
Se per risolvere tale problema si usa una versione successiva, compaiono altri bug, e questo vale solo per Linux per un semplice motivo: perché il team di Arduino ha finora distribuito la toolchain allegata all'IDE solo con la versione Windows. Se scaricate una toolchain Avr aggiornata e la usate così cosm'è, senza patch Atmel, anche voi utenti Windows avete gli stessi problemi che ho io perché i bug che ho nel tempo segnalato su questo forum riguardano il sorgente stesso della toolchain, quindi che si compili su Linux o Windows i bug restano. Le patch Atmel correggono proprio questi bug, ad esempio l'errore del delay che ho citato.

L'unica soluzione CERTA a tutti questi problema è la strada che ha seguito Astro, è la strada che ha seguito Bingo660 su AvrFreaks, è la strada che alla fine ho seguito anche io: scaricarsi i sorgenti della toolchain, applicare le patch di Atmel e compilare quella toolchain. Alla fine viene fuori una versione basata su avr-gcc 4.5.1, quindi non recentissima, ma funzionante.
L'ArduinoISP con versioni più recenti della toolchain continua a non funzionare, segno evidente che le patch Atmel sono al momento indispensabili.

Per dovere di cronaca dico che se ho tempo domani provo la toolchain basata su avr-gcc 4.7.0, e vediamo se risolve tutti i problemi riguardanti i bug menzionati senza bisogno delle patch di Atmel.

:slight_smile: e quindi ? :cold_sweat:

Dunque, purtroppo devo confermare, dopo aver fatto moltissime prove oggi pomeriggio, che ha ragione Leo: ArduinoISP non viene compilato correttamente ed infatti ho fatto la procedura per la nuova toolchain, quindi ho inviato ArduinoISP ad Arduino UNO, non sono più riuscito a fare un burn bootloader o ad inviare uno sketch; ho rimesso avr originale, ho ricaricato ArduinoISP, ho rifatto la procedura Toolchain e le operazioni ISP sono andate tutte a buon fine.
Dal mio punto di vista questa è una limitazione non da poco, ma bisogna considerare che la questione è nata per superare, come ben ricorda Leo, il problema degli sketch over64K, e quello sembra un problema risolto efficacemente. Personalmente non ho mezzi per fare quel tipo di test ma è ovvio che mi fido di quelli fatti da Astrobeed.
Ma il problema è: perché succede questa cosa? e perché succede solo (almeno da quanto sappiamo) con ArduinoISP e non con altri sketch, più o meno complessi. Sarebbe ora però assolutamente importante che qualcuno provasse a caricare (ovviamente su Arduino direttamente) qualche sketch importante, magari con diverse librerie, per capire se non ci sono altri problemi, diversamente tutta l'operazione diventerebbe un problema. Astro ha testato un suo firmware molto corposo, ma ora vorrei saperne di più da lui, sulla questione.
Sulla 1.0 non so che dire, a me l'errore l'ha dato compilando il blink, però ripento per l'ennesima volta che non gli ho dedicato nemmeno un minuto.

BrainBooster:
:slight_smile: e quindi ? :cold_sweat:

E quindi cosa? XD
MI hanno chiamato in causa, ho spiegato in maniera più chiara il perché di una frase che era stata ripresa da un mio precedente intervento. :stuck_out_tongue:

@Mike:
il fix per l'ArduinoISP è stato proposto più di 1 mese fa nel famoso thread che aprii sul forum internazionale dove mi lamentavo del fatto che con le ultime versioni della toolchain lo sketch non compilava più. All'epoca un utente rispose che lui aveva risolto abbasando la velocità a 9600 baud rispetto alle 19200 emulate dallo sketch.
Questa soluzione è stata poi fatta propria dal team perché l'IDE 1.0.1 contiene lo stesso identico fix per l'ArduinoISP.
Questo mi fa pensare che qualcosa nel codice compilato con le versioni più recenti faccia saltare i timing interni, e dato che ho ancora in gola i grattacapi che mi ha fatto ingoiare Avr-cdc, posso pensare che le temporizzazioni software, se saltano di pochissimo fanno saltare tutti i sincronismi. Ricordo che lo stesso astro mi confermò che l'ArduinoISP compilato con la toolchain contenuta in Ubuntu 11.10 all'oscilloscopio mostrava dei tempi non corretti.

leo72:
posso pensare che le temporizzazioni software, se saltano di pochissimo fanno saltare tutti i sincronismi. Ricordo che lo stesso astro mi confermò che l'ArduinoISP compilato con la toolchain contenuta in Ubuntu 11.10 all'oscilloscopio mostrava dei tempi non corretti.

Vero, la velocità della seriale risultava sbagliata di circa il 7-8%, quanto basta per creare seri problemi al trasferimento dati, pensavo fosse un problema solo di Linux, ma a questo punto è un problema dello sketch ISP e non del compilatore o del S.O.
Fino a fine settimana non posso dedicare tempo a questa cosa, però poi ci metto mano e vediamo di risolvere pure questa cosa una volta per tutte senza dover penalizzare la velocità di trasferimento, già a 19200 ci vuole un sacco di tempo per caricare un hex corposo, a 9600 potete pure lasciare tutto e andare a prendervi un caffè nel frattempo :slight_smile:

Quindi secondo voi è sufficiente che io modifichi ArduinoISP abbassando l'unico 19200 presente a 9600 e poi funziona tutto?
Diciamo che il problema sarebbe relativo, ma questo significherebbe allo stesso modo che nessun software potrebbe gestire una velocità maggiore di 9600? o ci sono problemi "peggiori"? Non credo visto che Banzi ha detto che hanno risolto, e se la soluzione è questa...

astrobeed:
pensavo fosse un problema solo di Linux, ma a questo punto è un problema dello sketch ISP e non del compilatore o del S.O.

Ma se con la 4.3.5 compila correttamente e con la 4.5.1 senza patch no, se lo sketch è lo stesso non dovrebbe essere un problema di compilatore? Forse è stato modificato qualcosa che introduce dei delay aggiuntivi che fanno saltare i tempi, tempi magari che l'autore dell'ArduinoISP aveva trovato empiricamente all'epoca essere corretti con la velocità a 19200. Forse è una somma di bug, del compilatore e dello sketch.

Fino a fgià a 19200 ci vuole un sacco di tempo per caricare un hex corposo, a 9600 potete pure lasciare tutto e andare a prendervi un caffè nel frattempo :slight_smile:

Verissimo! 25 kB impiegano 1 minuto tondo tondo per essere trasferiti su un Atmega... Pazzesco...

Il fix è nel changelog della 1.0.1. C'è scritto che l'ArduinoISP adesso lavora nuovamente ma con velocità a 9600. Quindi è una soluzione decisa dai Piani Alti.

Allora, ho abbassato da 19200 a 9600 nel setup di ArduinoISP, l'ho caricato nell'UNO, ho provato ad inviare un blink specifico ad un tiny2313, errore; forse ho capito male io. Pur sapendo che il valore nella board virtuale viene ignorato ero andato a cambiarlo ma nemmeno c'è la riga.

Ma parli dello sketch ArduinoISP della 0022 o della 1.0?
Il tipo che mi suggerì il fix mi linkò l'ArduinoISP della 1.0. Però non mi parlò di altre modifiche. Bisognerebbe fare un confronto fra lo sketch ArduinoISP 0022 e 1.0 e poi confrontarli con quello della 1.0.1 per vedere se ci sono altre differenze.

leo72:
Bisognerebbe fare un confronto fra lo sketch ArduinoISP 0022 e 1.0 e poi confrontarli con quello della 1.0.1 per vedere se ci sono altre differenze.

Lo sketch abbinato alla 1.0 è lungo 478 righe, quello con la 1.0.1 è lungo 552 righe, il secondo ha circa 20 righe in più nei commenti di testa, però la differenza totale è di 74 righe, direi che non hanno modificato solo la velocità :slight_smile:

Invece lo aveva detto. Mi sembrava di ricordare, ecco qui:

astrobeed:
Lo sketch abbinato alla 1.0 è lungo 478 righe, quello con la 1.0.1 è lungo 552 righe, il secondo ha circa 20 righe in più nei commenti di testa, però la differenza totale è di 74 righe, direi che non hanno modificato solo la velocità :slight_smile:

Adesso mi metto a fare un confronto, tanto non ho molto da fare fino alle 2:00.... :roll_eyes:

EDIT:
non appena ritrovo il link per scaricarla... qualcuno ce l'ha sottomano? :sweat_smile:
Trovato

Da una prima occhiata, demanda alla libreria SPI.h la spedizione dei dati mentre prima si appoggiava a funzioni interne. Non so se dipende solo da questo.

Leo, mi quoti e continui a leggere male quello che scrivo? :sweat_smile:
Io ho affermato come te che Banzi ha detto.... rileggi bene cosa ho scritto (diciamo che manca una virgola ma il significato resta quello :)) e intendevo dire che se la soluzione è quella è presto fatto; invece non va, forse perché io sto usando la 0022, e comunque per ora la 1.0 non la installo, quindi se fine settimana Astro trova la soluzione, ed è applicabile anche alla 0022 (lui ha detto che non la suppoprta più, quindi mi deve andare a c... che le modifiche siano compatibili :grin:), tutto bene, altrimenti no buono e pazienza :slight_smile:

Sì ti ho letto male. Ma sono un po' rinco, lo sai XD
Comunque lo sketch ArduinoISP allegato all'IDE 1.0 non è quello dell'IDE 1.0.1, è diverso e forse funziona come ha detto astro non solo per la velocità a 9600. Quindi se stai usando la 0022 tienitela pure stretta (come faccio io) perché con la 1.0 non cambia assolutamente niente. Il 16 aprile Max ha promesso l'IDE nuova, e con essa ci sarà lo sketch ArduinoISP nuovo. Vedremo.

grazie astro e michele per la guida...

...giusto per sapere, quali sono i benefici di questa mod? scrivetelo nel primo post! grazie :wink:

astro ma dici che basterebbe ricalibrare l'oscillatore interno all'avvio dello sketch per farlo tornare a funzionare a velocità regolare?
edit:
@Leo non avevo capito il tuo post perchè non avevo associato... non ho una memoria cosi buona :slight_smile:

Mi sono messo a spulciare nella IssueList dell'Arduino. Ecco l'issue #860:

Reported by project member wes...@gmail.com, Mar 15, 2012

The ArduinoISP sketch, widely used for burning bootloaders into AVRs, does not work when compiled using the 1.0 IDE. Failures occur during the attempts to "Program Page", when a largish block of data is sent at once.

This was suspected of being due to the new structure of the HWSerial library (receive buffer size decreased from 128 to 64), and was eventually tracked (thanks to Brian Cook) to the the heartbeat function used to pulse an LED during the idle loop. This does a delay(40), which means that even though it only happens when the sketch is "idle" or in between commands, a badly timed command exceeding 80bytes (at 19200bps) can overflow the buffer before processing starts.

The attached patch implements a replacement for delay that immediately aborts if serial traffic is detected. It also changes readbytes() to wait for the number of bytes requested, instead of assuming that they are already buffered at interrupt level.

Traduco:

Segnalato da membro del progetto wes...@gmail.com, Mar 15, 2012 (wes... a me pare che si stia parlando di Westgm, l'autore dell'Optifix)

Lo sketch ArduinoISP, usato diffusamento per caricare i bootloader negli AVR, non funziona quando viene compilato usando l'IDE 1.0. Fallisce durante il tentativo "Program Page", quando un grosso blocco di dati è spedito in un'unica volta.

Parrebbe che la cosa derivi dalla nuova struttura della libreria HWSerial (la dimensione del buffer di ricezione è stata ridotta da 128 a 64), ed è stata rilevata in un secondo tempo (grazie a Brian Cook) dalla funzione heartbeat usata per far lampeggiare un LED durante il ciclo di attesa. Questa funzione esegue un delay(40), il che significa che anche se ciò succede quando lo sketch è "inattivo" o nel mezzo di 2 comandi, un comando mal temporizzato eccedente 80 byte (a 19200 bps) può mandare in overflow il buffer prima che il processo inizi.

La patch allegata inserisce un sostituto per il delay che lo fa fermare immediatamente in presenza di traffico seriale. Cambia anche readbytes() per attendere il numero di byte richiesti invece di assumere che sono già stati bufferizzati a livello di interrupt.

Nel link trovate infatti allegata una patch. Sarebbe da provare (chi ne ha modo, io non posso al momento).

EDIT:
aggiungo: Type DEFECT - Status ACCEPTED - Priority HIGH

leo72:
Il 16 aprile Max ha promesso l'IDE nuova, e con essa ci sarà lo sketch ArduinoISP nuovo. Vedremo.

Speriamo sia compatibile anche con la 0022 :sweat_smile:

Trisonic:
grazie astro e michele per la guida...
...giusto per sapere, quali sono i benefici di questa mod? scrivetelo nel primo post! grazie :wink:

ci stiamo lavorando, abbi un po' di pazienza, intanto dai un'occhiata al Topic, come ho fatto io stasera, ME LO SONO RILETTO TUTTO, DISCUSSIONI SUI S.O. COMPRESE, in fondo sono solo 283 post :stuck_out_tongue_closed_eyes:, però visto a rileggere come escono le magagne? :wink:
@ Leo: ovvio lì si riferisce tutto all'1.0, altrimenti la farei io la prova, ma lì non c'è il file da scaricare ma un html, contenende le righe variate, se ho capito bene.