Compilazione lenta con schede ESP

Buonasera a tutti,

recentemente ho acquistato un micro ESP32. Ho impostato l'IDE di Arduino (versione 1.8.19) in modo che fosse in grado di programmare sia ESP8266 sia ESP32 (gli ESP8266 raramente li uso, ma mi fa comodo avere l'ambiente di programmazione già pronto). Peccato che i tempi di compilazione si siano allungati moltissimo: circa 5 minuti per compilare uno sketch con delle librerie. Se volete, ecco le librerie che ho usato:

#include <Arduino.h>
#include <ArduinoJson.h>
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <NTPClient.h>
#include <WiFiUdp.h>
#include <Firebase_ESP_Client.h>
#include "addons/TokenHelper.h"
#include "addons/RTDBHelper.h"
#include <random>

Riconosco che siano tante, ma il tempo di compilazione è aumentato con il tempo. Per esempio, un mese fa era "solo" di 2 minuti circa. Non penso che sia un problema di mancanza di potenza di computazionale (lavoro su una macchina con un Ryzen 5 2600, 16GByte, utilizzo solo SDD, Win10 PRO). Il fatto che mi disorienta è che se lavoro con schede Arduino (originali e non), lo sketch viene compilato e caricato sulla scheda in un lampo... :confused:

Riconosco che è un problema minore visto che lo sketch lo compila e carica correttamente comunque ... Se qualcuno potesse aiutarmi a capire quale sia il problema ne sarei grato.

Buona serata e grazie in anticipo

Gabriele

p.s. spero ancora di aver impostato correttamente i tag del forum

La toolchain con Arduino IDE per la compilazione con schede ESP32 purtroppo è lenta... in particolare quando si usano alcune funzionalità che si portano dietro molta roba.

Ho notato che invece Platformio è molto più veloce, ma non ho mai indagato oltre ad essere sincero.
In parte credo sia dovuto al fatto che conserva i file compilati nella cartella del progetto e quindi non va a ricompilarli ogni volta, però non credo che dipenda solo da quello perché spesso io spesso faccio un clean e ricompilo tutto e noto sempre una maggiore velocità a parità di condizioni.

1 Like

Il core per ESP è un vero mattone (si vede anche dalla dimensione degli eseguibili che genera) e ... anche su macchine ancora più potenti, impiega comunque un bel po' di tempo a compilare, specie la prima volta di una sessione, quando compila TUTTO (poi, normalmente, ricompila solo le cose che devono essere ricompilate) :roll_eyes:

Guglielmo

1 Like

Buona parte della colpa è sua, non ho mai capito perchè, ma la compilazione con windows di qualsiasi cosa sia al di fuori dei semplici AVR (ed è lenta anche quella, solo che c'è meno roba) è lentissima. Una qualsiasi macchina con linux (probabilmente anche una virtuale, ma non ho mai provato) compila molto più velocemente. Un raspberry pi (e questo l'ho provato) compila in tempi migliori dell'I7 con 16 giga che ho a lavoro.

Ciao, Ale.

2 Likes

Innanzitutto, grazie mille per le rapide risposte!!

Ho notato che la prima volta che si prova a compilare il tempo impiegato è infinito! A questo punto le strade che posso seguire, sono:

  1. installare Linux facendo un dual-boot(che il mio prof di sistemi e reti lo conosce molto bene e mi ha sempre detto che è molto rapido)

  2. trovare librerie simili, ma più leggere

  3. lasciare che il compilatore faccia il suo e nel mentre leggere un bel libro :grin:

Comunque, grazie ancora per le risposte

Auguro buona serata a tutti

Gabriele

Incuriosito ho fatto qualche test:

Notebook Windows 11, AMD Ryzen 9 7940HS, 16GB di RAM
Stesso identico esempio abbastanza articolato (WiFi, webserver, scrittura sulla flash integrata)
Compilazione da zero con la cartella temp appena ripulita.

Arduino IDE 1.8.19 - tempo di compilazione 1 minuto e circa 4 secondi!!!
Platformio full-clean (quindi incluso il download automatico delle librerie necessarie) - tempo di compilazione circa 20 secondi
Platformio clean (con librerie già scaricate e progetto configurato) - tempo di compilazione circa 13 secondi :open_mouth:

Direi che con Windows le cose vengono complicate dall'IDE in qualche modo :face_with_raised_eyebrow:

Già che ci sei, fai una prova con l'IDE 2.2.1 ... dovrebbe essere parecchio più veloce ...
... peccato che ancora NON lo ritengo una versione stabile :grin:

Guglielmo

50 secondi la prima volta da zero, 20 secondi la successiva (senza alcuna modifica nel mentre).
Platformio la seconda compilazione senza modifiche la completa in poco meno di 8 secondi...

Direi che il team di sviluppatori dell'IDE ha un bel po' di lavoro da fare :laughing:

1 Like

... e che a forza di voler "semplificare la vita agli utenti", l'IDE deve fare un'infinità di cose "di nascosto" che invece ... sarebbe bene che gli utenti imparassero a fare! :roll_eyes:

Non conosco Platformio ... puoi chiamare una funzione senza prima averla dichiarata o dichiarto il prototipo?

Guglielmo

Si a livello di scrittura del codice è del tutto simile.
Il plus a mio avviso è che la configurazione è salvata a livello di progetto (nel file platformio.ini).

Ci sono un'infinità di opzioni per ciascuna piattaforma supportata
Ad esempio è possibile specificare le dipendenze del progetto (con eventuali versioni) sia a livello di core che di librerie.
Con esp inoltre è utilissimo il tool di analisi dello stack integrato nel monitor seriale, in caso di errori.

Nel momento in cui vai a compilare, il sistema di sviluppo si scarica tutto quello che serve in modo autonomo facendone una copia locale.

Ovviamente questa cosa è opzionale e si possono usare anche le librerie già installate con Arduino IDE specificandone il percorso.

Diciamo che è un po' più laborioso definire il progetto all'inizio, ma una volta fatto non hai più pensieri.

Scrivo giusto per informare le persone che verranno a vedere questo post e anche per esprimere la mia esperienza.

Come ha mostrato @cotestatnt usare Platformio è sicuramente la "soluzione" a questo problema. In 80 secondi circa mi ha compilato e flashato l'intero sketch quando prima (con l'IDE diArduino) ci impiegavo minimo 5 minuti!!:scream:

Per chi volesse provare questa piattaforma, ho trovato questa guida super semplice e chiara (ci ho impiegato letteralmente 2 minuti ad impostarla): Artifex.it - Come programmare una scheda ESP 32 con PlatformIO e Visual Studio Code

A mio avviso è anche più comodo specialmente per chi è abituato a usare VSCode tutto il giorno, come me. Adesso posso procedere con il mio progettone! Grazie di cuore a tutti coloro che hanno partecipato alla discussione :grinning:.

Buona continuazione

Gabriele

2 Likes

Aggiungo qualche ulteriore informazione/precisazione.

Nel tutorial quello che viene affermato non è del tutto corretto (forse è stato scritto molto tempo fa):

  • il file principale del progetto all'interno del folder /src non deve necessariamente chiamarsi main.cpp, ma può avere qualsiasi nome ed è supportata senza problemi anche l'estensione .ino

Nel file platformio.ini oltre alle dipendenze esterne che l'ambiente di sviluppo va a recuperare in automatico, è possibile aggiungere anche le librerie che sono state già installate con Arduino IDE.

; Includo la cartella predefinita per le librerie Arduino
lib_extra_dirs = ~/Documents/Arduino/libraries

; Aggiungo le dipendenze "remote"
lib_deps = 
   bblanchon/ArduinoJson@6.21.5
   https://github.com/cotestatnt/async-esp-fs-webserver.git

In questo esempio va a recuperare la versione 6.21.5 della libreria ArduinoJson e l'ultima commit disponibile della libreria async-esp-fs-webserver (i repository di default sono cercati su Github, ma si può specificare l'indirizzo completo e volendo anche una cartella locale).

Le librerie lib_deps hanno la "precedenza" ovvero se la libreria ArduinoJson è gia presente nella cartella libraries (magari con l'ultima versione 7.0.1), verrà comunque usata la libreria indicata con versione 6.21.5.

Se si sta sviluppando con ESP32 oppure ESP8266 è molto utile l'opzione "exception_decoder" che decodifica in automatico nel monitor seriale l'errore in caso di eccezione.
Può tornare utile anche dover specificare il tipo di partizione che si usa per il file system (LittleFS, FFat, SPIFFS etc)

; Serial Monitor options
monitor_speed = 115200
monitor_filters = esp32_exception_decoder

; oppure 
monitor_filters = esp8266_exception_decoder

; selezione del tipo di filesystem
board_build.filesystem = littlefs

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.