|  | 

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à:

  1. Variante Universale C: Scritta in C altamente ottimizzato, offre prestazioni superiori alle implementazioni open-source comparabili. Supporta processori da 8 a 64 bit.
  2. 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).
  3. 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:

  1. Funzioni Aritmetiche: Implementano le operazioni base (addizione, sottrazione, moltiplicazione, divisione, conversioni) emulando il comportamento di una FPU.
  2. 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)

LibreriaUtilizzo ROM (Flash)
SEGGER emFloat10.628 byte
IAR17.656 byte
AC6 MicroLib18.668 byte
GNU (GCC)33.809 byte

Confronto su RISC-V (RV32IMC)

LibreriaUtilizzo ROM (Flash)
SEGGER emFloat12.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.

Articoli simili