MDK-ARM v6 di Arm KEIL - Il parere di un Esperto

Trevor Martin di Hitex ci ha gentilmente consentito di riprodurre un suo articolo che illustra nel dettaglio l’approccio innovativo adottato da Arm per l’architettura della nuova versione v6 del sistema di sviluppo KEIL MDK.
Lo ripubblichiamo con piacere, confidando di offrire ai nostri clienti una visione autorevole ed innovativa sullo sviluppo moderno dei progetti software.

 

L’Architettura della Toolchain MDK6

Perché lo sviluppo embedded moderno ha bisogno di una toolchain modulare

Lo sviluppo del software embedded si è tradizionalmente basato su toolchain monolitiche integrate in un unico IDE. Questi ambienti riuniscono in una sola applicazione strettamente accoppiata tutto ciò che serve: editor, sistema di build, supporto ai dispositivi, debugger e configurazione del progetto. Sebbene questo approccio abbia funzionato bene quando i progetti embedded erano di piccole dimensioni e le piattaforme hardware erano fisse, oggi crea limiti significativi per i team di sviluppo moderni. Un approccio più recente separa l’ambiente di sviluppo in componenti modulari e indipendenti. Questa è l’idea architetturale alla base dell’ecosistema MDK6, che integra tecnologie come Visual Studio Code, CMSIS-Toolbox e una gamma di simulatori denominati Arm Fixed Virtual Platforms (FVP). Questa architettura modulare rende lo sviluppo embedded più scalabile, portabile tra sistemi operativi e perfettamente compatibile con i moderni workflow di ingegneria del software.

I limiti delle toolchain embedded tradizionali

La maggior parte degli IDE embedded è stata progettata attorno a un singolo ambiente di sviluppo integrato che controlla ogni aspetto del flusso di lavoro.

Tipicamente, questi strumenti combinano:
- Editor del codice sorgente
- Sistema di build
- Configurazione dei dispositivi
- Strumenti di debug
- Configurazione del progetto
A prima vista questa integrazione sembra comoda, ma introduce diverse sfide a lungo termine.
Un problema comune è che il sistema di build risulta fortemente accoppiato all’IDE. In molti casi, la build del firmware dipende da file di progetto dell’IDE che sono difficili da riprodurre al di fuori dell’ambiente di sviluppo. Questo rende molto più complessa l’automazione delle build e la Continuous Integration (CI).

Un’altra limitazione è la dipendenza dall’hardware fisico. Molti workflow richiedono la presenza di hardware reale per eseguire i test, limitando così le possibilità di testing automatizzato e rallentando i cicli di sviluppo.
Il vendor lock-in rappresenta un ulteriore problema: molti IDE sono ottimizzati per un singolo produttore di silicio, rendendo difficile il riutilizzo del software su famiglie di microcontrollori diverse.
Man mano che i sistemi embedded diventano più complessi, questi limiti diventano sempre più problematici e generano attrito aggiuntivo per i team di sviluppo.

Un’architettura modulare per lo sviluppo embedded

L’ecosistema MDK6 risolve questi problemi separando l’ambiente di sviluppo in diversi componenti modulari indipendenti.

Invece di un unico strumento monolitico, il sistema si basa su quattro componenti principali:
1. L’ambiente di sviluppo (IDE o CLI)
2. Il sistema di build
3. L’ecosistema software
4. L’ambiente di esecuzione (scheda di valutazione, hardware personalizzato o simulazione)

Ciascuno di questi componenti svolge un ruolo specifico rimanendo debolmente accoppiato agli altri. Questa progettazione offre una flessibilità nettamente superiore e riduce significativamente le difficolta’ per i team di sviluppo.

L’ambiente di sviluppo

MDK6 utilizza Visual Studio Code come IDE per la modifica, la compilazione e il debug del firmware.

VS Code offre una piattaforma di sviluppo leggera, ampiamente adottata e dotata di un ricco supporto di estensioni.
Gli sviluppatori beneficiano di funzionalità moderne dell’editor quali navigazione avanzata del codice, controllo di versione integrato e strumenti di sviluppo assistiti dall’IA.

Poiché VS Code è indipendente dalla toolchain sottostante, può evolversi senza influenzare il resto del sistema di sviluppo.
Le funzionalità di build e debug di MDK6 vengono fornite sotto forma di estensioni per VS Code, disponibili con licenze a pagamento User Based per scopi commerciali.

Il sistema di build

Il layer di build è fornito da CMSIS-Toolbox, che offre un moderno sistema di build in grado di funzionare senza problemi sia all’interno di un IDE sia tramite interfaccia a riga di comando (CLI).

Questo approccio duale permette agli sviluppatori di lavorare in modo interattivo nell’IDE durante lo sviluppo, utilizzando però lo stesso sistema di build nei workflow automatizzati da linea di comando.

Un’architettura “CLI-first” garantisce che le build siano completamente riproducibili e si integrino naturalmente con i sistemi di Continuous Integration e con le pipeline di build automatizzate, mantenendo al contempo una comoda gestione del progetto e il debug all’interno dell’IDE.

Questo sistema di build supporta architetture firmware complesse, tra cui:
- Più immagini firmware
- Più target hardware
- Componenti software riutilizzabili
Disaccoppiando il sistema di build da qualsiasi IDE specifico, i progetti firmware rimangono portabili, coerenti tra ambienti di sviluppo e sistemi operativi diversi, e facili da automatizzare sia in locale sia nelle pipeline CI.

L’ecosistema software

Il terzo layer dell’architettura fornisce il supporto ai dispositivi e i componenti software riutilizzabili.

Questo layer si basa sull’ecosistema CMSIS e sui software packs, che contengono:
- Descrizioni dei dispositivi
- Driver di periferiche
- Componenti middleware
- Librerie per IoT, DSP e machine learning
- Librerie di sicurezza
Ampio supporto software e strumenti di terze parti

Grazie all’utilizzo di interfacce standardizzate, il software sviluppato per un microcontrollore Cortex-M può spesso essere riutilizzato su un altro con modifiche minime. Questo migliora notevolmente la portabilità del software e riduce i costi di manutenzione a lungo termine.

Hardware e simulazione

L’ultimo layer del sistema di sviluppo MDK6 rappresenta l’ambiente di esecuzione su cui viene eseguito il firmware.

Nello sviluppo tradizionale questo layer è costituito esclusivamente da hardware fisico. MDK6 estende questo concetto supportando sia
hardware reale sia ambienti di simulazione tramite Arm Fixed Virtual Platforms (FVP).
Le piattaforme virtuali consentono di eseguire il firmware su un microcontrollore generalizzato simulato. Questo permette lo sviluppo anticipato dei componenti software core prima che l’hardware sia disponibile e rende possibile il testing automatizzato all’interno delle pipeline di Continuous Integration.
La simulazione permette inoltre di eseguire un elevato numero di test automatizzati senza richiedere dispositivi fisici.

Abilitare workflow di sviluppo moderni

Separando IDE, sistema di build, ecosistema software e ambiente di esecuzione, MDK6 allinea lo sviluppo embedded alle pratiche di ingegneria del software moderne.

Questa architettura supporta workflow oggi comuni in altri ambiti dello sviluppo software, tra cui:
- Build e debug tradizionali tramite IDE
- Pipeline di build automatizzate via CLI
- Testing indipendente dall’hardware
- Progetti firmware scalabili multi-prodotto
- Ambienti di sviluppo basati su cloud
Queste capacità diventano sempre più importanti man mano che i sistemi embedded crescono di complessità e i team di sviluppo diventano più numerosi e distribuiti.

Un nuovo modello per lo sviluppo embedded

Lo sviluppo embedded sta evolvendo oltre il tradizionale workflow basato su un unico IDE.

Man mano che i prodotti diventano più complessi e i team adottano pratiche di
sviluppo moderne, le toolchain devono adattarsi per supportare maggiore scalabilità e automazione.
L’architettura modulare adottata da MDK6 dimostra come le toolchain embedded possano essere strutturate per soddisfare questi nuovi requisiti, continuando a fornire le capacità professionali di debug, compilazione e supporto ai dispositivi necessarie
per lo sviluppo firmware.

Questo approccio considera lo sviluppo embedded come parte integrante del più ampio ecosistema dell’ingegneria del software, anziché come una disciplina separata con strumenti isolati.
Questa evoluzione permette ai team embedded di adottare workflow moderni senza sacrificare le capacità specializzate richieste dallo sviluppo hardware-centrico.

L'esperto

Trevor Martin si è laureato con lode in ingegneria elettrica ed elettronica presso la Brunel University nel 1988. Nello stesso anno ha iniziato a lavorare come ingegnere hardware junior presso Philips Medical Systems. Nel 1992 è entrato a far parte di Hitex in qualità di specialista tecnico per gli strumenti di sviluppo di microcontrollori a 8 bit, tra cui i modelli 8051, 68HC11, 05 e 08. Ha inoltre acquisito esperienza con protocolli di rete quali CAN, USB e TCP/IP. Dal 2000 si occupa di microcontrollori basati su ARM, inizialmente con CPU ARM7 e ARM9 per poi passare ai processori Cortex-M. Per promuovere questi dispositivi, ha lavorato a stretto contatto con NXP e ST e, in misura minore, anche con TI e Freescale. Dal 2005 ha scritto una serie di libri della collana "Insider’s Guide", che sono tutorial introduttivi alle famiglie di microcontrollori basati su ARM come LPC2000, STR9 e STM32. Tiene inoltre corsi di formazione regolari, un workshop generale sui microcontrollori Cortex e corsi specifici sui dispositivi.