Segger emFloat
Sviluppato e perfezionato per oltre due decenni, emFloat è un componente altamente ottimizzato di emRun (la libreria runtime C di SEGGER) ed è parte integrante di SEGGER Embedded Studio.
Progettato per essere “plug-and-play”, emFloat può sostituire la libreria a virgola mobile predefinita, offrendo prestazioni superiori con meno codice. Estremamente veloce e compatto, garantisce prestazioni simili a quelle di una FPU (Floating Point Unit) tramite puro software. Laddove presente una FPU hardware, emFloat ne potenzia ulteriormente le prestazioni per le funzioni matematiche complesse.
È disponibile come modulo stand-alone in formato codice sorgente per gli sviluppatori che desiderano aumentare le prestazioni o ridurre le dimensioni del codice senza sostituire l’intera libreria runtime del proprio toolchain. emFloat è stato scelto anche da terze parti, come Microchip, per essere incluso nei loro compilatori (es. Microchip XC32 V4.0).
Caratteristiche principali
- Codice compatto, prestazioni elevate: Sostituisce la libreria standard migliorando l’efficienza.
- Plug-and-play: Integrazione immediata nei progetti esistenti.
- Licenza flessibile: Per applicazioni utente o fornitori di toolchain.
- Variante C universale: Utilizzabile su qualsiasi CPU a 8/16/32/64 bit.
- Varianti ottimizzate in Assembly: Versioni scritte a mano per RISC-V e ARM.
- Completamente rientrante: Supporta ambienti multi-tasking.
- Nessun utilizzo di Heap: Non richiede allocazione dinamica della memoria.
Varianti del prodotto
emFloat è disponibile in una variante universale in C e in versioni specifiche per architettura che includono moduli in assembly per massimizzare la velocità:
- Variante Universale C: Scritta in C altamente ottimizzato, offre prestazioni superiori alle implementazioni open-source comparabili. Supporta processori da 8 a 64 bit.
- Variante Arm: Codificata interamente in Assembly e conforme allo standard AEABI. È compatibile con toolchain GCC, LLVM/Clang, Arm Compiler (Keil) e IAR. Supporta qualsiasi CPU ARM a 32 bit (Cortex-M, A, R).
- Variante RISC-V: Scritta in assembly e compatibile con l’EABI. Supporta architetture RV32I e RV32E, con accelerazione specifica per l’estensione M (moltiplicazione/divisione) e istruzioni compatte (estensione C).
Implementazione e Design
emFloat si divide in due parti principali:
- Funzioni Aritmetiche: Implementano le operazioni base (addizione, sottrazione, moltiplicazione, divisione, conversioni) emulando il comportamento di una FPU.
- Funzioni Matematiche: Utilizzano i più moderni ed efficienti algoritmi per il calcolo di funzioni complesse (seno, logaritmo, ecc.), avvantaggiando il sistema sia in presenza che in assenza di FPU hardware.
Ottimizzazione specifica per architettura:
Nelle varianti Assembly, emFloat sfrutta le peculiarità di ogni processore. Ad esempio, per la divisione a singola precisione:
- Utilizza istruzioni di divisione hardware se disponibili.
- In assenza di divisione ma in presenza di moltiplicazione, usa l’approssimazione reciproca iniziale raffinata tramite iterazioni di Newton-Raphson.
- In assenza di entrambe, utilizza un algoritmo di divisione “non-restoring”.
Integrazione e Utilizzo
emFloat fornisce tutte le API standard delle librerie C (tramite math.h) e le funzioni EABI chiamate implicitamente dal compilatore. Può essere usato in due modi:
- Uso integrato: Si chiama la funzione standard (es.
sin(x)). Il linker utilizzerà la versione di emFloat invece di quella standard. - Uso “Side-by-side”: Si chiamano esplicitamente le funzioni SEGGER (es.
SEGGER_sin(x)), mantenendo la libreria standard del toolchain per il resto del progetto.
Opzioni di configurazione
La libreria può essere configurata per privilegiare la dimensione del codice o la velocità di esecuzione su una scala da -2 a +2:
- -2: Massima riduzione del codice a scapito della velocità.
- 0: Bilanciato.
- +2: Massima velocità a scapito della dimensione.Indipendentemente dalla modalità, la precisione dei calcoli rimane identica.
Benchmark di confronto (Dimensione ROM)
Di seguito è riportato il confronto della memoria Flash occupata chiamando una selezione di funzioni matematiche (sin, cos, tan, ecc.) su diverse piattaforme.
Confronto su Arm (ARMv7M, Software FP)
| Libreria | Utilizzo ROM (Flash) |
| SEGGER emFloat | 10.628 byte |
| IAR | 17.656 byte |
| AC6 MicroLib | 18.668 byte |
| GNU (GCC) | 33.809 byte |
Confronto su RISC-V (RV32IMC)
| Libreria | Utilizzo ROM (Flash) |
| SEGGER emFloat | 12.644 byte |
| GNU (GCC) | 47.176 byte |
Licenze
emFloat è disponibile per l’integrazione in progetti specifici o per i fornitori di toolchain.
- Pagamento unico: Solitamente senza royalty.
- Codice sorgente: Fornito con commenti completi.
- Commerciale: Può essere integrato in prodotti proprietari senza l’obbligo di divulgare il codice sorgente combinato (a differenza delle licenze open-source).
- Opzione Buyout per produttori di silicio: Possibilità di redistribuire emFloat ai propri clienti sotto i propri termini.
