Domanda:
Come abilitare la rimozione massima del codice morto?
EEd
2014-09-25 23:20:58 UTC
view on stackexchange narkive permalink

Sto esaurendo il codice e lo spazio di memoria dati su ATMega328P.

La dimensione del codice è grande poiché ho utilizzato diverse librerie, ma utilizzo solo alcune funzioni di quelle librerie.

Apparentemente, l'IDE predefinito sta eseguendo solo un lavoro parziale nella rimozione del codice morto (rimuove il codice e i dati non referenziati).

Alcuni esperimenti mostrano:

  1. Un normale programma che utilizza diverse librerie Arduino ha una dimensione del codice di 22 kilo byte.

  2. Rinomina setup in o_setup. Rinomina loop in o_loop

    Aggiungi

    void setup () {};

    void loop () {};

    La dimensione del codice è di 8 kilo byte mentre il programma è effettivamente "vuoto".

  3. Avvia un nuovo programma.

    Aggiungi

    void setup () {};

    void loop () {};

    La dimensione del codice è di 0,5 kilo byte

Apparentemente, l'IDE (linker chiamato dall'IDE) sta eseguendo un lavoro di rimozione "parziale" del codice morto, poiché riducendo il codice da 22kB a 8kB (caso 1 e 2), invece di 0,5kB (caso 3).

Come posso abilitare la funzione di rimozione massima del codice morto (recuperare lo spazio del codice occupato dalle funzioni di libreria inutilizzate)?

Tieni presente che alcune librerie dichiarano variabili globali, istanze di una classe, per cui il codice del costruttore (e tutte le sue dipendenze) sarà collegato al programma finale. Quindi il semplice fatto di `# includere` una libreria ma non usarla può ancora aggiungere molto codice nel processo di collegamento.
Ho bisogno di tutte le librerie in quanto sono driver di chip hardware fisici. Ma io uso solo poche funzioni di ogni libreria. Potresti gentilmente spiegare "istanze di una classe, per la quale il codice costruttore"? La var globale può essere 'ottimizzata / rimossa' dal linker che vede che è dichiarata come mai usata, guardando la mappa di collegamento in linguaggio assembly, giusto?
Nel caso 2 hai anche rimosso tutto il codice al di fuori di loop2 e setup2. Per esempio. per usare la libreria Servo dovresti usare `#include ` `Servo myservo;`. Qui `Servo myservo;` crea effettivamente nell'istanza della classe Servo, con tutta la sua memoria di cui ha bisogno per le sue variabili private.
Puoi elencare le librerie di cui hai bisogno?
Ho diverse schede dei sensori hardware e ognuna ha la propria lib necessaria (driver) per funzionare. Ad esempio, il driver LCD ha molte funzioni per disegnare linee, cerchi, torta, riempimento, ecc. Ma uso solo la modalità di disegno 3D del testo. Nel peggiore dei casi, posso eliminare manualmente la parte inutilizzata della fonte della libreria. Può richiedere tempo poiché l'interdipendenza è ovunque. Il LINKER dovrebbe essere in grado di eseguire questa operazione automaticamente. La domanda è come accenderlo e comandarlo per eseguire? Il compilatore può ancora allocare codice / spazio ram. linker è il gate finale per mantenere chi ha informazioni complete e aggiornate, quale codice dove, chiama chi e chiamato da chi
Ad esempio, molti driver del sensore hardware lib hanno 2 funzioni per fornire unità SI e Imperiali. Ne uso solo uno. Alcuni hanno impostazioni modificabili dall'hardware come, gamma, guadagno, parametri. Non ho bisogno di molti di questi perché utilizzo molte impostazioni predefinite.
Una risposta:
#1
+6
mpflaga
2014-09-27 08:36:18 UTC
view on stackexchange narkive permalink

Abilita il verbose del tuo IDE della compilazione tramite le preferenze. Da lì puoi vedere esattamente cosa e come viene compilato.

In breve l'IDE (e la toolchain) compilerà tutto e tutto ciò che può trovare in un oggetto. Dove solo il codice utilizzato viene compilato nella fase di collegamento, poiché la raccolta dei rifiuti è abilitata con il comando "--gc-sezioni".

Nota che il livello di ottimizzazione è "-Os" o "Ottimizza per dimensioni ". In IDE 1.0. + Questo sembra essere hardcoded. Dove come in IDE 1.5. + Le opzioni del compilatore sono configurabili, in "\ arduino-1.5.6-r2 \ hardware \ arduino \ avr \ platform.txt" possono essere personalizzate per soddisfare le tue esigenze.

Dove puoi utilizzare il comando avr-objdump come descritto in https://stackoverflow.com/questions/15291750/does-importing-libraries-load-everything-in-arduino/15296808#15296808.

Suggerirei 1.5.6r2 e non 1.5.7 poiché i comandi gcc non verranno eseguiti individualmente senza alcune manipolazioni del percorso.

puoi provare a cambiare -Os in -O2 o -O3 per rimpicciolire. Si suppone che S includa 2. Tuttavia, in alcuni casi l'ho visto diventare più piccolo.
`-O2` e` -O3` chiedono al compilatore di ottimizzare il suo output per la velocità, non per la dimensione. Quindi il binario compilato diventerà più grande anziché più piccolo.


Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 3.0 con cui è distribuito.
Loading...