Ottimizziamo il codice del core di Arduino

In risposta a @gpb01 [MAC] Aggiornamento IDE 1.0x all'ultima versione Atmel Toolchain - #120 by gpb01 - Megatopic - Arduino Forum
Si ci si è preoccupati per niente, anche se la 3.4.2 non si comportava bene come la 3.4.3. Guardiamo il lato positivo, abbiamo imparato qualcosa. Se vogliamo creare una nostra classe con metodi che prendono un puntatore in flash, nella lista dei parametri scriviamo:

myFnc(PGM_P ptrf);

Che però non ci permette di usare il polimorfismo di cui è capace il C++.
Risolviamo come nel core Arduino:

myFnc(const __FlashStringHelper *ifsh) 
{
     PGM_P p =  (PGM_P)ifsh;
     ...
}

Tra l'altro __FlashStringHelper dovrebbe essere visibile negli sketch e quindi conviene usarla.
Se non è visibile allora si dovrà includere WString e se questo crea problemi dovrebbe anche bastare una semplice
class __FlashStringHelper; dopo gli include.

Io ci provo, arruolo lesto. Clona il repositor di arduino, sia in locale che in remoto, così noi possiamo vedere che lesto a un suo repo arduino su github, e poco per volta sistemi il core e tutto il quello che ti viene in mente.
Sai bene che di java io non ci capisco, mentre tu ci lavori tutti i giorni.

Ciao.

io posso falro, ma non ho capito bene cosa dovrei cambiare nel java. Fate attenzione che ho già arduino clonato, ma una versione vecchissimissima.

Quello che dovremmo fare di sicuro è una serie di test per verificare che tutto funzioni con la nuova toolchain

Intanto ripulire tutti i warning è cosa buona e giusta no.

Comparare un int e un unsigned int può portare facilmente a risultati inaspettati e allora perché non vedere di sistemare il core in modo che il compilatore non emetta warning.

Posso dirti con certezza che il mio codice viene compilato senza warning, sia lato PC che lato embedded, c'è anche il modo per evitare che gcc emetta unused warning, usando proprio l'attributo unused che al momento non ricodo come si fa.

Per le modifiche al IDE, nelle preferenze ci vorrebbero due line edit CXX_FLAGS e LFLAGS, così da poter modificare i flags di compilazione e linking. Potrebbero anche bastare alcune checkBox per limitare il numero di flags, una potrebbe essere quella che abilita i float nella printf. Poi se hai tempo e voglia, di modifiche profonde c'è n'è a iosa.

ciao.

Intanto ripulire tutti i warning è cosa buona e giusta no.

Approvo, ma parliamo di modificare le lib, qui8ndi lato c++. Allora, tu hai modificato le lib per eliminare i warning?

io ad aggiungere una di textbox per passare degli argomenti al compilatore/linker/uploader credo di metterci un attimo.

Mauro, Lesto ... molto interessanti le Vs. discussioni, ma questo thread è dedicato a "[MAC] Aggiornamento IDE 1.0x all'ultima versione Atmel Toolchain" ... quindi ...
... cortesemente aprite un altro thread dedicato a chi si vorrà dedicare alle modifiche del "core" (così questo resta dedicato al tuo titolo) e ... a convincere poi le alte sfere ad accettarle ed inserirle nelle distibuzioni.

@Leo : Poi ci pensi tu a spostare questi ultimi post di Mauro e Lesto nel giusto thread così il loro rimane un bel discorso pulito e logico ... e si riesce a seguirlo bene ?

Grazie :wink:

Guglielmo

Ho messo la discussione in questo nuovo thread, mi pare appropriato come titolo.

lesto:

Intanto ripulire tutti i warning è cosa buona e giusta no.

Approvo, ma parliamo di modificare le lib, qui8ndi lato c++. Allora, tu hai modificato le lib per eliminare i warning?

io ad aggiungere una di textbox per passare degli argomenti al compilatore/linker/uploader credo di metterci un attimo.

Lo so, lo so, potrei ripeterlo mille volte, ma non lo ricordereste comunque. Io non uso il core Arduino, non uso L'ide Arduino, ho le mie routine C, il mio IDE QtCreator, il mio flasher AvrDudeQui, con questi ho la massima flessibilità e con il mio codice gcc non emette warning e non ho disabilitato i warning. Questo vuol dire che durante lo sviluppo i warning ci sono, se stabilizzi un API devi provvedere a ripulire i warning, cosa che ho fatto nelle mie routine, quindi è fattibile ripulire il core come lo è stato per il mio codice.

io ad aggiungere una di textbox per passare degli argomenti al compilatore/linker/uploader credo di metterci un attimo.

Ok non correre, parliamone, dammi il tempo di visionare il codice java dove vengono lanciati i processi di build.
Comunque ci sono delle flags vitali per arduino e quindi non dovrebbe essere possibile modificarle o se si da la possibilità bisogna mettere un button che resetti le flags a quelle originali considerate vitali per arduino.

@gpb01
Hai ragione, ho fatto una escursione fuori pista.
@Grande leo, sei sempre più reattivo.

Ciao.

Consiglierei di revisionare il codice delle versioni 1.5.x e non quello delle 1.0.x in quanto prima o poi verrà abbandonato.
E' anche vero però che il codice della 1.0.5 è stabile mentre la 1.5.x (oggi arrivato alla 1.5.5) è in continua evoluzione.

MauroTec:

myFnc(const __FlashStringHelper *ifsh) 

{  PGM_P p =  (PGM_P)ifsh;
    ...
}



Tra l'altro __FlashStringHelper dovrebbe essere visibile negli sketch e quindi conviene usarla.
Se non è visibile allora si dovrà includere WString e se questo crea problemi dovrebbe anche bastare una semplice
class __FlashStringHelper; dopo gli include.

In questo thread:
http://forum.arduino.cc/index.php?topic=202262.msg1492087#msg1492087
un utente chiese come rendere la UTFT compatibile con F(); ho suggerito questo codice scopiazzando da print.cpp del core e mixando con la print della UTFT, non testato, ma scrissi correttamente?

dammi il tempo di visionare il codice java dove vengono lanciati i processi di build.

https://github.com/arduino/Arduino/blob/ide-1.5.x/app/src/processing/app/debug/Compiler.java

@lesto

List baseCommandLinker = new ArrayList(Arrays.asList(new String[] {
      avrBasePath + "avr-gcc",
      "-Os",
      "-Wl,--gc-sections"+optRelax,
      "-mmcu=" + boardPreferences.get("build.mcu"),
      "-o",
      buildPath + File.separator + primaryClassName + ".elf"
    }));

    for (File file : objectFiles) {
      baseCommandLinker.add(file.getAbsolutePath());
    }

    baseCommandLinker.add(runtimeLibraryName);
    baseCommandLinker.add("-L" + buildPath);
    baseCommandLinker.add("-lm");

Questo dovrebbe essere il codice per il linker, dove si vede che alla fine viene aggiunto -lm per la libreria math che deve essere sempre presente. L'ideale sarebbe che il campo editabile permetta di fare questo:
-(Os) + (O2). Il significato è: rimuovo il flag Os e aggiungo O2, ma è troppo complicato, rendiamolo semplice.
Per cui una edit line con un buddy button così: Optimize flags: -Os [reset default flags]
dove

io invece farei una textbox con i valori di default (e piccolo pulsantino "reset"), così che uno possa modificare il comportamento del compilatore, però sarebbe da decidere cosa può essere utile modificare (e qui chiedo a te, io non gioco mai con i compilatori)

edit: per le ottimizzazioni una combobox (per intenderci i menù a tendina) è ottima

edit: per le ottimizzazioni una combobox (per intenderci i menù a tendina) è ottima

Ottimo tanto sono solo 4, quella di default sarà sempre -Os e il pulsante reset to default selezionerà questo valore.

La optimize e già un flag, se fai una text box si corre il rischio di poter modificare tutto a piacere con potenziali effetti disastrosi, teniamo sempre in conto il fatto che l'utente medio non è in grado di rimettere le flags correttamente, perché gli esiti della modifica delle flags può facilmente comportare una mancata compilazione. Il flag O0 è utile per il debug. Nota che l'optimize viene usato nel linker e nel compilatore vero e proprio, ancora devo isolare il codice e postarlo.

Un altro flag da inserire sarebbe "-save-temps" ma questo va in CXX_FLAGS cioè quando il sorgente viene trasformato in codice ".o", che poi è il processo di compilazione vero e proprio. -save-temps crea dei file ".i" già espansi dal preprocessore C/C++, così se abilitiamo questo flag possiamo vedere il lavoro svolto dal preprocessore ed è utile quando pasticciamo con le macro. Inoltre vengono creati dei file ".s" contenenti sorgente asm corrispondente ai singoli moduli "cpp". Tradotto in modo commestibile save-temps conserva i file temporaneamente creati durante il build.
Per questo basta una comune check box.

Alcune considerazioni:
Ogni progetto dovrebbe avere le proprie impostazioni, ma con arduino IDE non abbiamo file che descrivono il progetto e quindi cambiando impostazioni queste influiranno su qualunque progetto. Cosa utile allora sarebbe quella di documentare il progetto specificando quali flags si devono usare. In genere Os è la scelta primaria e le altre serviranno solo per debug e sperimentazione e test.

La stringa da inserire per fare in modo che printf accetti float è la seguente:

-Wl,-u,vfprintf -lprintf_flt

da inserire in baseCommandLinker.
Che verra inserita o meno in base ad una check box del tipo enable prinf float, con magari una tooltip del tipo: "La dimensione finale del firmware saranno maggiori ecc". Questo facilmente potrebbe portare l'utente a pensare di usare il core arduino con string & e in più abilitare print float e questo non è cosa senzata.

PS: con tooltip intendo quei messagi che compaiono se sosti con il mouse su un "widget" o components.

Ciao.

 static private List getCommandCompilerS(String avrBasePath, List includePaths,
    String sourceName, String objectName, Map<String, String> boardPreferences)

Restituisce una lista di argomenti che saranno usati solo quando l'ide incontra un file sorgente ".S"
Qui non serve intervenire al momento, perché l'argomento -Ox non è previsto.

static private List getCommandCompilerC(String avrBasePath, List includePaths,
    String sourceName, String objectName, Map<String, String> boardPreferences)

Restituisce una lista di argomenti che saranno usati solo quando l'ide incontra un file sorgente ".c"
qui -Ox deve essere presente e -save-temps può essere presente o meno in base alla check box.

static private List getCommandCompilerCPP(String avrBasePath,
    List includePaths, String sourceName, String objectName,
    Map<String, String> boardPreferences)

Stessa cosa di sopra ma con i sorgenti ".cpp"

Consiglierei di revisionare il codice delle versioni 1.5.x e non quello delle 1.0.x in quanto prima o poi verrà abbandonato.
E' anche vero però che il codice della 1.0.5 è stabile mentre la 1.5.x (oggi arrivato alla 1.5.5) è in continua evoluzione.

Vero, peccato che il codice della 1.5 io non l'ho clonato e non so nemmeno cosa è cambiato, se non pesa molto ora clono il repo 1.5, ma quasi sicuramente in tempi umani non ne ricaverò informazioni necessarie per metterci mani, forse lesto può dire qualcosa di più che mi aiuti a studiare il codice più velocemente o quanto meno a farmi una idea. Il tree di progetto dell'ide io non l'ho comprendo, es perché Compiler.java si trova dentro la dir debug? Qual'è il codice dell'IDE e quello delle librerie di terze parti? ecc. Io ogni volta che navigo il tree mi perdo.

161Mb e ancora sta scaricando, troppo pesante...ma che si porta dietro java, il compilatore avr8, quello per arm ecc, ma che sono matto.

Ciao.

la struttura non è molto user frindly, ma i java sono tutti assieme, i programmi esterni sono richiamati da terminale.

per la dimensione, si porta dietro tutta la storia, clona solo il ramo 1.5.x con una depth di 1 (solo ultima versione) e va più che bene.

il codice fondamentalmente CREDO sia lo stesso.

spero di avere tempo domani (aka non dormo fino a tardi, la sera mangio fuori), ah, potessi avere del tempo libero!!

edit: credo siano in debug perchè testavano la doppa copilazione multipiattafroma.

per il preferencies:

mamma mia che casino, usano un sistema loro di preferencies quando basterebbe usare il sitema standar di java.. vabbè, in pratica devi far finire l'opne nella hashmap "table", dopo di che con un Preferencies.getBoolean(nome) o getTipoDato(nome) hai il dato dove vuoi (vedi linea 85 del Compile.java, usa Preferences.getBoolean("build.verbose"))

Io ho risolto gli errori di compilazione dovuti al pgmspace ripescando i metodi deprecati dalla nuova toolchain senza necessità di mettere mano al core
--> [WIN] Aggiornam. compilatore IDE 0022-0023-1.0 all'ULTIMA VERSIONE ATMEL - #645 by PaoloP - Megatopic - Arduino Forum

Mmm ... palliativo che funzionerà ancora per una o due ... tre release e poi, essendo comunque i metodi deprecati, prima o poi non verrà più supportato.

Se le cose si devono fare, si devono fare bene, proponendo a chi di dovere le correzioni da fare sul codice per renderlo conforme alle ultime releases del compilatore.

E comunque ... non ci sono solo warning (... che oltretutto abbiamo visto essere ininfluenti) sul PGMSPACE ... ci sono valanghe di altri warning compilando applicazioni per ATtiny =(
Quanto questi warning (... con il core del tiny) siano gravi ... ancora non l'ho determinato ... ma sono veramente tanti :frowning:

Guglielmo

A me su Windows con 1.5.5 + TC 3.4.3 + AVRdude 6.0.1 + core Tiny modificato (vedi post mio e di Leo: Compilare sketch per ATtiny su IDE 1.5.8 - Generale - Arduino Forum) non da nessun errore di compilazione.
Mi passi lo sketch che stai testando tu?

Attento, NON ho parlato di errori (... non mi da alcun errore) ... ho parlato di una marea di WARNING :wink:

Ti allego la lista che esce ... magari molti escono anche con la vecchia Toolchain ... c'è solo da verificarli e capire quanto sono importanti ... o quanto sono trascurabili :smiley:

Guglielmo

P.S. : Finché non è stabile, mi RIFIUTO di usare la 1.5.x ... quindi tutte le prove sono con la STABILE 1.0.5.
Altrimenti, se devo fare qualche cosa che questa proprio non supporta ... uso Atmel Studio 6.1 :wink:

Warning_Tiny.txt (29.8 KB)

La cosa è veramente curiosa perché ho messo anche il verbose sulla compilazione e, con la mia configurazione (1.55 ecc..), non esce neanche mezzo warnigs. :frowning:

gpb01:
P.S. : Finché non è stabile, mi RIFIUTO di usare la 1.5.x ... quindi tutte le prove sono con la STABILE 1.0.5.

Mi sembra di sentire Michele. :grin: :grin:

EDIT: E' stata aperta una richiesta per la soluzione del problema --> Use PGM_P instead of prog_char by matthijskooijman · Pull Request #1695 · arduino/Arduino · GitHub
E' in elenco per la versione 1.5.6 (la prossima).