|  | 

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

  •  |  | 

    Segger emWin

    emWin è la libreria grafica per sistemi embedded di SEGGER. Fornisce strumenti e API per la creazione di interfacce grafiche (GUI) su piattaforme microcontrollore, consentendo anche a sistemi con risorse limitate di eseguire interfacce utente interattive di alta qualità. Supporta display sia semplici che complessi ad alta risoluzione, è progettata specificamente per il mondo embedded…

  •  |  | 

    emFile RAID 5

    Sebbene l’acronimo R-A-I-D derivi da Redundant Array of Independent (originariamente Inexpensive) Disks, i termini “recuperabile” e “replicabile” sono più accurati di “ridondante”. Storicamente, i dispositivi di archiviazione sono stati i dischi rigidi. Nelle applicazioni embedded, questi possono essere qualsiasi tipo di dispositivo di memoria (NAND, NOR, SD) e, date le dimensioni del sistema, l’archiviazione è…

  •  |  |  |  | 

    Segger emSSH

    emSSH di SEGGER è una soluzione per il login tramite secure shell, che consente l’accesso protetto a qualsiasi applicazione server all’interno di un prodotto. Può essere utilizzato in quasi tutti i dispositivi: è indipendente dal target e funziona sia in applicazioni native per computer che in sistemi embedded. L’ampia gamma di opzioni garantisce la massima…

  •  |  |  | 

    Segger emSSL

    emSSL offre un supporto completo per i più recenti protocolli TLS, fornendo funzionalità avanzate senza i vincoli delle licenze open-source o dell’obbligo di attribuzione. Può essere integrato senza problemi in prodotti gratuiti, commerciali o proprietari senza la necessità di divulgare il codice sorgente combinato. Fornito come codice sorgente in ANSI C, emSSL garantisce la massima…

  •  | 

    Flasher Hub-4

    Versione compatta del Flasher Hub-12, il Flasher Hub-4 controlla più unità Flasher Compact per consentire la programmazione simultanea. È possibile collegare fino a 24 Flasher utilizzando uno o più moduli SEGGER USB Hub-7 per creare un potente programmatore “gang” (multiplo) per una programmazione parallela efficiente ad alto volume. Il Flasher Hub-4 di SEGGER gestisce diverse…