Perché e come utilizzare i microcontroller multicore per dispositivi IoT periferici

Di Jacob Beningo

Contributo di Editori nordamericani di DigiKey

Agli sviluppatori di dispositivi per Internet delle cose (IoT) periferici viene chiesto di incorporare una gamma di funzioni sempre più diversificata e ad alta intensità di calcolo, dai sensori di comunicazione e di campionamento all'esecuzione di inferenze di apprendimento automatico (ML). Allo stesso tempo, vien loro chiesto di mantenere o ridurre il consumo energetico. Serve un approccio strutturale più flessibile a un aspetto centrale del progetto - il microcontroller - che consenta agli sviluppatori di aggiungere funzionalità e raggiungere un equilibrio ottimale tra prestazioni, funzionalità e consumo energetico.

Questo approccio si presenta sotto forma di microcontroller multicore. Come suggerisce il nome, questi hanno più core di elaborazione in un unico contenitore. Tuttavia, il semplice fatto di aver più core non significa aver risolto il problema. Gli sviluppatori devono conoscere le differenze tra processori multicore simmetrici e asimmetrici, saper come affrontare il partizionamento funzionale e come programmarli in modo efficace.

Questo articolo spiegherà concettualmente i microcontroller multicore prima di discutere come gli sviluppatori li possano sfruttare per bilanciare le prestazioni e i vincoli energetici. Saranno portati a titolo di esempio diversi microcontroller multicore della linea STM32H7 di STMicroelectronics. L'articolo esaminerà anche diversi casi d'uso in cui gli sviluppatori possono sfruttare l'elaborazione multicore e dividere il carico di lavoro tra più core.

Introduzione ai microcontroller multicore

Come detto, i microcontroller multicore hanno più di un core di elaborazione. Sono due le configurazioni tipiche che vengono utilizzate: l'elaborazione simmetrica e quella asimmetrica. Le configurazioni simmetriche dei core contengono due o più core di elaborazione esattamente uguali. Ad esempio, potrebbero essere entrambi processori Arm® Cortex®-M4. I core asimmetrici, invece, possono contenere un processore Arm Cortex-M7 e un processore Arm Cortex-M4. Potrebbero anche contenere un processore Arm Cortex-M4 e un processore Arm Cortex-M0+. Le combinazioni sono molteplici e dipendono dai requisiti applicativi e progettuali.

Agli sviluppatori di IoT interessano i microcontroller multicore perché permettono di separare la loro applicazione in più domini di esecuzione, che a loro volta offrono un controllo preciso delle prestazioni, delle caratteristiche e delle esigenze di potenza dell'applicazione. Ad esempio, un core può essere utilizzato per interagire con un utente attraverso un display ad alta risoluzione, mentre il secondo core viene utilizzato per gestire in tempo reale i requisiti del sistema come il controllo di un motore, dei relè e dei sensori di campionamento.

Esistono molti modi in cui uno sviluppatore può partizionare la propria applicazione, ma i due paradigmi maggiori riguardano il separare l'applicazione in:

  • Piena funzionalità/tempo reale
  • Tempo reale/sicurezza

Nel primo paradigma, piena funzionalità/tempo reale, il sistema è esattamente come quello descritto in precedenza. I componenti applicativi ricchi di funzionalità, come il display, le inferenze ML, la riproduzione audio e lo storage di memoria sono tutti gestiti da un unico core. Il secondo core gestisce le funzioni in tempo reale come il controllo del motore, il rilevamento e gli stack di comunicazione (Figura 1).

Schema del paradigma piena funzionalità/tempo realeFigura 1: Un paradigma per la progettazione di applicazioni con microcontroller multicore consiste nel posizionare i componenti applicativi a piena funzionalità in un core e i componenti in tempo reale nel secondo core. (Immagine per gentile concessione di STMicroelectronics)

Il secondo paradigma separa l'applicazione in funzionalità in tempo reale e funzionalità sicure. Nel primo core, l'applicazione può gestire ad esempio il display, l'accesso alla memoria e la riproduzione audio in tempo reale. Il secondo core invece non può fare altro che fungere da processore di sicurezza. In quanto tale, il secondo core gestirebbe la memorizzazione di dati critici come le chiavi del dispositivo e di rete, gestirebbe la crittografia, il bootloader sicuro e qualsiasi altra funzione che possa rientrare nella categoria di software sicuro (Figura 2).

Schema con i componenti applicativi in tempo reale in un unico coreFigure 2: Un altro paradigma per la progettazione di applicazioni con microcontroller multicore consiste nel posizionare i componenti applicativi in tempo reale in un unico core e tutti i componenti di sicurezza in un secondo core. (Immagine per gentile concessione di STMicroelectronics)

Esistono altri modi potenziali per analizzare lo spazio applicativo di un microcontroller multicore, ma questi due paradigmi sembrano essere i più diffusi tra gli sviluppatori di IoT.

Selezione della scheda di sviluppo per un microcontroller multicore

Anche se i microcontroller multicore si stanno diffondendo rapidamente, non sono ancora usati a tappeto e selezionarli può essere difficile. Uno sviluppatore che desideri lavorare con i microcontroller multicore dovrebbe selezionare una scheda di sviluppo con le caratteristiche seguenti:

  • Dotata di LCD per l'esplorazione di applicazioni a piena funzionalità
  • I/O di espansione
  • Basso costo
  • Dotata di un ecosistema comprovato, comprendente codice di esempio, forum e accesso ad ingegneri delle applicazioni esperti

Vediamo alcuni esempi di STMicroelectronics, a partire da STM32H745I-DISCO (Figura 3). Questa scheda è basata sul microcontroller a 2 core STM32H745ZIT6 che comprende un core Arm Cortex-M7 a 480 MHz e un secondo processore Arm Cortex-M4 a 240 MHz. Il componente include un'unità a virgola mobile a doppia precisione e una cache L1 con 16 kB di dati e 16 kB di cache di istruzioni. La scheda è particolarmente interessante perché include funzionalità aggiuntive come:

  • Un codec audio SAI
  • Un microfoni per sistemi microelettromeccanici (MEMS)
  • Flash QUAD SPI su scheda
  • 4 GB di eMMC
  • Espansione con scheda figlia
  • Ethernet
  • Basette per audio e cuffie

La scheda di sviluppo incorpora numerose capacità che semplificano enormemente la sperimentazione con un microcontroller multicore e consentono di scalare un'applicazione.

Immagine della scheda STM32H745I-DISCO di STMicroelectronicsFigura 3: La scheda STM32H745I-DISCO integra una vasta gamma di sensori e capacità di memoria che permettono agli sviluppatori di testare i microcontroller dual core a 480 MHz e 240 MHz. (Immagine per gentile concessione di STMicroelectronics)

Per gli sviluppatori alla ricerca di una scheda di sviluppo dalle capacità aggiuntive e con più I/O di espansione, STM32H757I-EVAL può essere la soluzione ideale (Figura 4). STM32H757I-EVAL include funzionalità aggiuntive rispetto alla scheda di valutazione, ad esempio:

  • 8 M x 32 bit di SRAM
  • 1 Gbit di Flash NOR SPI twin quad
  • Embedded Trace Macrocell (ETM) per il tracciamento delle istruzioni
  • Potenziometro
  • LED
  • Pulsanti (anti-manomissione, joystick, riattivazione)

Queste capacità aggiuntive, specialmente l'espansione di I/O, possono essere molto utili agli sviluppatori.

Immagine della scheda STM32H757I-EVAL di STMicroelectronicsFigura 4: La scheda STM32H757I-EVAL offre agli sviluppatori molto spazio di espansione, un facile accesso alle periferiche e uno schermo LCD per iniziare a lavorare con applicazioni multicore. (Immagine per gentile concessione di STMicroelectronics)

Dopo aver esaminato varie schede di sviluppo, il passo successivo consiste nel delineare alcune raccomandazioni per iniziare a utilizzare un'applicazione per microcontroller multicore.

Come iniziare la prima applicazione multicore

Indipendentemente dalla scheda di sviluppo STM32H7 selezionata, sono due gli strumenti principali necessari per iniziare. Il primo è STM32CubeIDE di STMicroelectronics, un ambiente di sviluppo integrato (IDE) gratuito che permette agli sviluppatori di compilare il codice applicativo e distribuirlo alla scheda di sviluppo. STM32CubeIDE fornisce anche le risorse necessarie per eseguire il debug di un'applicazione ed è disponibile per i principali sistemi operativi, tra cui Windows, Linux e MacOS.

Il secondo strumento è il pacchetto firmware STM32H7 di STMicroelectronics. Questo include esempi per le schede di sviluppo STM32H7 per:

  • Elaborazione multicore
  • Utilizzo di FreeRTOS
  • Driver periferici
  • FatFS (file system)

Gli sviluppatori vorranno scaricare il pacchetto applicativo del firmware e familiarizzare con gli esempi supportati dalla scheda di sviluppo scelta. In particolare, ci sono due cartelle a cui prestare attenzione. La prima è la cartella delle applicazioni con due esempi che dimostrano come usare OpenAMP (Figura 5). Questi esempi dimostrano come trasmettere i dati tra i core del microcontroller, dove un core invia i dati all'altro core, che poi li ritrasmette al primo core. I due esempi lo fanno in modo diverso. Uno è baremetal, senza sistema operativo, mentre l'altro è con FreeRTOS.

Immagine di OpenAMP STM32Cube_FW_H7Figura 5: STM32Cube_FW_H7 fornisce diversi esempi che dimostrano come utilizzare l'elaborazione multicore mediante OpenAMP. (Immagine per gentile concessione di Beningo Embedded Group)

La seconda serie di esempi dimostra come configurare entrambi i core con e senza RTOS (Figura 6). Un esempio mostra come eseguire FreeRTOS su ogni core, mentre l'altro mostra come usare un RTOS su un core ed eseguire il secondo core baremetal. Vi sono diversi altri esempi nel pacchetto firmware che dimostrano altre capacità, ma questi sono ottimi punti di partenza.

Immagine di STM32Cube_FW_H7 con diversi esempiFigura 6: STM32Cube_FW_H7 fornisce diversi esempi che dimostrano come configurare un sistema operativo con processori multicore. (Immagine per gentile concessione di Beningo Embedded Group)

Caricando un progetto di esempio, lo sviluppatore vedrà un layout di progetto simile a quanto mostrato nella Figura 7. Come illustrato, il progetto è suddiviso in codice applicativo per ciascun core. La configurazione del build può anche essere impostata in modo che uno sviluppatore lavori con un solo core alla volta. Questo è illustrato nella Figura 7, attraverso i file ombreggiati in grigio.

Immagine di esempio del progetto OpenAMP Ping-PongFigura 7: Un esempio di progetto OpenAMP Ping-Pong dimostra agli sviluppatori come creare un canale di comunicazione tra i due core della CPU. (Immagine per gentile concessione di Beningo Embedded Group)

La descrizione completa del codice di esempio esula dalle finalità di questo articolo ma il lettore può esaminare il file readme.txt associato a uno degli esempi per una descrizione dettagliata del suo funzionamento, quindi esaminare il codice sorgente per vedere come avvenga effettivamente la comunicazione interprocessore (IPC).

Suggerimenti e consigli per lavorare con i microcontroller multicore

Iniziare con i microcontroller multicore non è difficile ma gli sviluppatori devono pensare al progetto della loro applicazione in modo un po' diverso. Ecco alcuni suggerimenti e consigli per iniziare a utilizzare un microcontroller multicore:

  • Valutate attentamente l'applicazione per determinare quale sia la separazione del dominio applicativo più sensata. È possibile mescolare i domini su un singolo processore ma se non si fa attenzione le prestazioni possono risultare compromesse.
  • Prendetevi il tempo necessario per esplorare le funzionalità integrate nel framework OpenAMP e come sfruttarle nell'applicazione.
  • Scaricate gli esempi di applicazione per i processori STM32H7 ed eseguite gli esempi multicore per la scheda di sviluppo selezionata. H747 ne comprende due: uno per FreeRTOS e uno per OpenAMP.
  • Quando eseguite il debug di un'applicazione, non dimenticate che ora avete due core in esecuzione! Assicuratevi di selezionare il thread corretto all'interno dell'ambiente di debug per esaminarne lo storico delle chiamate.
  • Sfruttate le risorse hardware interne, come un semaforo hardware, per sincronizzare l'esecuzione delle applicazioni sui core.

Seguendo questi consigli, gli sviluppatori che iniziano con una scheda di sviluppo ben supportata e che quindi seguono questi consigli per utilizzare al meglio i microcontroller multicore risparmieranno parecchio tempo ed eviteranno grattacapi.

Conclusione

Per gli sviluppatori di sistemi IoT periferici alla rete, i microcontroller multicore offrono la possibilità di abbinare e bilanciare meglio funzionalità, prestazioni e consumo energetico in base ai requisiti dell'applicazione. Questi microcontroller consentono agli sviluppatori di suddividere la propria applicazione in domini come piena funzionalità/tempo reale o tempo reale/elaborazione sicura. Questa capacità di separare un'applicazione in diversi domini permette di disattivare un core per risparmiare energia quando il dominio di elaborazione non è più necessario o di attivarlo per migliorare le prestazioni dell'applicazione.

Come mostrato, esistono varie schede di sviluppo che possono essere utilizzate per iniziare a esplorare la progettazione di applicazioni con microcontroller multicore e aver il controllo totale sulle loro prestazioni e profilo energetico.

DigiKey logo

Esonero della responsabilità: le opinioni, le convinzioni e i punti di vista espressi dai vari autori e/o dai partecipanti al forum su questo sito Web non riflettono necessariamente le opinioni, le convinzioni e i punti di vista di DigiKey o le sue politiche.

Informazioni su questo autore

Image of Jacob Beningo

Jacob Beningo

Jacob Beningo è un consulente software embedded e attualmente lavora con clienti in più di una decina di paesi per trasformare radicalmente le loro attività migliorando la qualità dei prodotti, i costi e il time-to-market. Ha pubblicato più di 200 articoli sulle tecniche di sviluppo di software embedded, è un relatore e un istruttore tecnico e ha conseguito tre lauree, tra cui un master in ingegneria presso University of Michigan. Risponde all'indirizzo jacob@beningo.com, ha un sito web personale www.beningo.com e produce una Newsletter mensile Embedded Bytes cui è possibile iscriversi.

Informazioni su questo editore

Editori nordamericani di DigiKey