Blog
Come usare ESP32 Dual Core con Arduino IDE
La maggior parte dei progetti che utilizzano microcontrollori inizia in modo molto basilare, leggendo sensori, accendendo e spegnendo LED o trasmettendo dati tramite seriale. Con l'aumentare delle dimensioni dei progetti, tuttavia, attività cosiddette di overhead come comunicazioni wireless, rilevamento in tempo reale, interfacce utente ed elaborazione dati iniziano a competere per il tempo della CPU. Qui l'architettura dual-core dell'ESP32 rappresenta un enorme vantaggio.
L'ESP32 dispone di due core di elaborazione indipendenti (rispetto ai comuni microcontrollori single-core), che consentono l'esecuzione simultanea di due attività. Ciò dovrebbe consentire agli sviluppatori di creare sistemi più reattivi, stabili e scalabili senza passare a una toolchain completamente nuova, se correttamente utilizzato nell'ambiente Arduino.
Questo documento discute il dual core ESP32 sotto l'IDE Arduino e dedica particolare attenzione a intuizioni pratiche, piani di implementazione nel mondo reale e insidie, senza trasformare l'argomento in un manuale di codici a basso livello RTOS.
Comprendere l'architettura dual-core dell'ESP32
L'ESP32 dispone di due core Tensilica indipendenti ma condivisibili per memoria e periferiche. Il sistema ha una gestione interna del multitasking, dello scheduling e del coordinamento tra core utilizzando FreeRTOS.
Nella maggior parte delle configurazioni ESP32:
- Il Core 0 gestisce principalmente operazioni a livello di sistema come Wi-Fi, Bluetooth e servizi in background.
- Il Core 1 è tipicamente utilizzato per la logica delle applicazioni utente.
Con il framework Arduino applicato a ESP32, gran parte di questa complessità viene rimossa. Le funzioni standard setup e loop sono già utilizzate come parte di task FreeRTOS. Ciononostante, gli sviluppatori possono aggiungere ulteriori task e assegnarli a un core specifico quando è necessario un controllo di fine tuning.
Quando (e quando non) usare il Dual Core
L'elaborazione dual-core è potente, ma non è sempre necessaria. Capire quando usarla aiuta a evitare complessità non necessarie.
Esempi di applicazione appropriati includono:
- Acquisizione sensori indipendente dalla comunicazione Wi-Fi
- Gestione del controllo in tempo reale durante l'aggiornamento di un display
- Separare le attività urgenti dalla registrazione in background
- Migliorare la reattività nelle applicazioni IoT
Casi in cui un dual core potrebbe non essere necessario:
- Semplici progetti di lettura di sensori
- Registrazione dei dati a bassa frequenza
- Applicazioni con vincoli di tempo minimi
L'uso del dual-core dovrebbe essere una decisione di progettazione, non una scelta predefinita. Un uso eccessivo può introdurre problemi di sincronizzazione che non esistono nei design a ciclo singolo.
Configurazione ESP32 Dual Core in Arduino IDE
Innanzitutto, è necessario installare il pacchetto ESP32 board nell'ambiente Arduino. L'ESP32 è compatibile con Arduino poiché l'utente può utilizzarlo in modo simile a una scheda Arduino.
L'IDE Arduino è un programma che viene eseguito automaticamente sull'ESP32 con il sistema FreeRTOS. Il supporto dual-core non necessita di alcuna configurazione speciale per essere abilitato.
Considerazioni importanti sull'impostazione includono:
- Selezione della variante corretta della scheda ESP32
- Utilizzare le impostazioni predefinite di flash e partizione a meno che non sia richiesto un uso avanzato della memoria
- Abilitazione dell'uscita seriale per il debug nelle prime fasi
In questa fase, il sistema è già capace di multitasking, anche se lo sketch appare semplice.
Compiti, Core e il Loop di Arduino
Nello sketch Arduino classico, ogni logica viene eseguita all'interno di loop (). E sull'ESP32, loop è di per sé un task FreeRTOS associato a un core.
Per sfruttare la capacità dual core, gli sviluppatori creano più attività che:
- Esegui in modo indipendente da loop()
- Può essere assegnato a Core 0 o a Core 1
- Operare a diverse priorità
C'è uno stack e un contesto di esecuzione per ogni attività, ed è possibile utilizzarli in un modo veramente parallelo. Ora è possibile eseguire letture di sensori continuamente mentre le comunicazioni o gli aggiornamenti dell'interfaccia utente vengono eseguiti senza blocchi.
Implementazione di Task Dual Core Passo dopo Passo (Esempio Fai-da-te)
Come esempio di una pratica concreta, si può utilizzare un progetto fai-da-te con ESP32 che possa leggere i sensori e trasmettere i dati tramite la rete Wi-Fi.
Definire Compiti Indipendenti
L'applicazione è suddivisa in aree di responsabilità logiche:
- Compito A: Legge i dati del sensore a intervalli fissi
- Compito B: Gestisce la comunicazione Wi-Fi e la trasmissione dei dati
Questo isolamento impedisce alle operazioni di rete lente di interrompere la raccolta di dati sensibili al tempo.
Assegnazione di attività a core specifici
La lettura del sensore è normalmente posizionata sul Core 1, mentre la comunicazione può essere posizionata sul core 0 o sul Core 1 a seconda del carico di lavoro del sistema. La selezione della dimensione dello stack e della priorità viene effettuata per evitare crash o starvation.
Tale strategia rende il sistema reattivo anche in presenza di un traffico di comunicazione significativo.
Gestire risorse condivise tra core
La capacità di utilizzare le risorse condivise in modo sicuro è uno degli aspetti più cruciali nella programmazione dual-core. Poiché entrambi i core possono accedere alla memoria, una progettazione non accurata può causare comportamenti imprevedibili.
Le considerazioni principali includono:
- Protezione delle variabili condivise
- Evitare l'accesso simultaneo ai periferici hardware
- Gestione dell'output seriale per prevenire la corruzione dei messaggi
Le race condition possono essere rimosse e la coerenza dei dati garantita senza eccessivi overhead utilizzando semplici metodi di sincronizzazione.
Problemi comuni dei processori Dual Core e suggerimenti per il debug
Gli sviluppatori nuovi ai progetti ESP32 dual-core incontrano spesso problemi simili:
- Reset casuali causati da dimensioni dello stack insufficienti
- Il watchdog timer si attiva a causa di codice bloccante
- Compiti con priorità errate che bloccano gli altri
- Instabilità di potenza durante la trasmissione Wi-Fi
Questi problemi vengono isolati con l'aiuto di un debug sistematico. La registrazione seriale, l'isolamento dei task e il test incrementale possono essere particolarmente efficaci con più core.
Ottimizzazione delle prestazioni: buone pratiche
Per ottenere il massimo beneficio dal dual core dell'ESP32:
- Assegna attività critiche in termini di tempo al loro core specifico
- Evitare lunghi ritardi bloccanti
- Usa il multitasking invece degli interrupt dove appropriato
- Monitorare il consumo energetico sotto carico
L'uso del dual core dovrebbe anche migliorare la reattività, piuttosto che aggiungere solo complessità.
Strategia di test e validazione
I sistemi dual-core dovrebbero essere testati oltre la funzionalità di base. La convalida include:
- Test di durata a lungo termine
- Test di stress con traffico Wi-Fi continuo
- Misurazione dell'accuratezza del tempo del sensore
- Verifica del ripristino del sistema dopo interruzioni di rete
Questi test confermano che i compiti rimangono stabili e sincronizzati nel tempo.
Considerazioni durante il passaggio alla progettazione di PCB
Nel caso di un progetto ESP32 dual-core che passa a un PCB, la progettazione hardware è direttamente influenzata dalle decisioni sul firmware. Il multitasking deve essere considerato in termini di allocazione dei GPIO, routing dell'alimentazione e accesso al debug.
Importanti considerazioni sui PCB includono:
- Progettazione di alimentatori stabili
- Accoppiamento adeguato vicino all'ESP32
- Punti di test per il debug
- Separazione chiara dei segnali sensibili
Le app dual-core sono più propense a richiedere un'integrità di potenza elevata e quindi la qualità del PCB è molto significativa per esse.
Considerazioni finali
L'utilizzo efficace del dual core ESP32 nell'ambiente Arduino consente agli sviluppatori di creare sistemi embedded più affidabili, reattivi e scalabili. Conoscendo la pianificazione dei task sui core, le risorse condivise possono essere utilizzate in modo efficiente e test approfonditi possono garantire che l'elaborazione dual-core non sia uno strumento complesso.
Il supporto dual-core dell'ESP32, disponibile per gli utenti Arduino disposti a uscire dai design a loop singolo e passare a design più potenti e capaci, è un efficace passo successivo con un'organizzazione appropriata del firmware e buone pratiche di progettazione dei PCB.
Domande Frequenti (FAQ)
Sì. Il loop di Arduino viene già eseguito come un task FreeRTOS, quindi è possibile il multitasking a core singolo. Il dual-core consente semplicemente un migliore isolamento dei task critici in termini di tempo e di quelli in background.
Utilizza la funzione xTaskCreatePinnedToCore(). Consente di "fissare" un task FreeRTOS al Core 0 o al Core 1, controllando la località di esecuzione ed evitando contese non necessarie.
Leggermente. L'esecuzione di attività in parallelo può consumare più energia, ma una progettazione attenta con modalità di sospensione, cicli efficienti e prioritizzazione delle attività mantiene i consumi gestibili.
Utilizza il logging seriale, i mutex e le notifiche dei task per monitorare l'esecuzione dei task. Evita conflitti tra risorse condivise e testa un task alla volta prima di combinarli.
Alcune librerie con operazioni bloccanti o accesso diretto all'hardware potrebbero causare race conditions. Controlla sempre la documentazione della libreria e considera l'inclusione dell'accesso in task protetti da mutex.
Il Core 0 gestisce solitamente i servizi di sistema come Wi-Fi e Bluetooth. Eseguire i task dell'utente sul Core 1 aiuta a evitare interruzioni e garantisce una comunicazione wireless stabile anche sotto carico pesante.
Paul R è un ingegnere meccatronico specializzato in elettronica, progettazione di PCB e sistemi embedded. Ha esperienza con KiCad, Altium Designer, EasyEDA e Eagle, e ha una conoscenza pratica della programmazione Arduino, del prototyping IoT e dell'integrazione hardware-software.