Segger emRun++
emRun++ è una libreria standard C++ completa, utilizzabile con qualsiasi toolchain. È stata specificamente ottimizzata per sistemi e applicazioni embedded. In quanto linguaggio di programmazione moderno, il C++ sta diventando sempre più importante nel settore embedded, offrendo agli sviluppatori opzioni sempre più vaste. Con questo obiettivo, emRun++ viene costantemente aggiornata per soddisfare i più moderni standard C++.
emRun++ è anche parte integrante dell’IDE Embedded Studio di SEGGER. Inclusa nella toolchain pronta all’uso e nella libreria runtime C di Embedded Studio, è disponibile immediatamente e possiede tutte le caratteristiche che rendono la programmazione orientata agli oggetti (OOP) veloce e semplice.
Caratteristiche principali
- Libreria standard C++ completa.
- Compatibilità con i comuni standard C++, incluso C++17.
- Integrazione totale con emRun (libreria runtime C).
- Gestione dinamica della memoria, ottimizzata per sistemi embedded.
- Gestione delle eccezioni, incluso lo stack unwinding su tutti i target supportati.
Funzionalità C++ moderne
emRun++ implementa classi e funzioni secondo gli standard ISO. Integra il set completo di funzionalità dello standard C++17 definito dall’Organizzazione Internazionale per la Normalizzazione (ISO).
La libreria fornisce tutti i file header C++ standard insieme a wrapper per gli header della libreria runtime C. L’implementazione include il name mangling delle funzioni C standard, mappando ad esempio cos(float) e cos(double) ai rispettivi equivalenti C cosf() e cos().
Allocazione dinamica della memoria
Le moderne applicazioni C++ si affidano all’allocazione dinamica della memoria. Gli oggetti risiedono in memoria solo mentre vengono utilizzati. Gli oggetti a lunga durata vengono solitamente creati con new e distrutti con delete. Mentre il C++ si occupa di chiamare rispettivamente i costruttori e i distruttori degli oggetti, la libreria runtime C sottostante gestisce la memoria fisica.
emRun++ implementa new e delete in modo che utilizzino le routine alloc e free della libreria runtime emRun, garantendo un uso efficiente della memoria heap con il minimo sovraccarico (overhead).
Gestione delle eccezioni
Il C++ definisce l’uso delle eccezioni, a differenza del C dove la responsabilità di recuperare manualmente un errore e propagarlo ai chiamanti ricade interamente sull’utente. La gestione delle eccezioni offre un approccio sistematico e robusto per affrontare errori che non possono essere risolti localmente.
Quando viene lanciata un’eccezione in un blocco try, tutti gli oggetti costruiti all’interno del blocco devono essere distrutti e lo stack deve essere “srotolato” (stack unwinding). Per supportare ciò, emRun++ implementa lo stack unwinding specifico per ogni architettura target supportata.
Supporto di basso livello
I compilatori C++ definiscono un’interfaccia binaria dell’applicazione (ABI) che stabilisce, ad esempio, come vengono disposti gli oggetti, come funziona il name mangling o come vengono implementate le funzioni virtuali.
emRun++ implementa le funzioni di basso livello della C++ ABI alle quali il compilatore aggiunge implicitamente chiamate durante la generazione del codice. Ciò consente alla libreria C++ di essere utilizzata immediatamente con qualsiasi toolchain.
Occupazione di memoria (Memory Footprint)
I seguenti dati mostrano l’utilizzo della ROM (in byte) confrontando emRun++ con la libreria standard GNU libstdc++.
Arm (32-bit)
| Progetto di test | emRun++ | libstdc++ |
| Empty (Vuoto) | 496 | 9.244 |
| STL_List1 | 1.192 | 69.409 |
| STL_Map1 | 1.464 | 70.217 |
RISC-V (32-bit)
| Progetto di test | emRun++ | libstdc++ |
| Empty (Vuoto) | 676 | 858 |
| STL_List1 | 1.868 | 90.848 |
| STL_Map1 | 2.380 | 91.620 |
RISC-V (64-bit)
| Progetto di test | emRun++ | libstdc++ |
| Empty (Vuoto) | 542 | 888 |
| STL_List1 | 1.414 | 87.314 |
| STL_Map1 | 1.758 | 88.104 |
