venerdì 7 ottobre 2011

Matematica Embedded

L'utilizzo di piccoli sistemi embedded, ad esempio microcontrollori 8-bit Microchip PIC o ATMEL AVR, è sempre più diffuso in elettrodomestici, apparecchi industriali e finanche gadget. Tali sistemi offrono spesso funzionalità smart che estendono il campo di utilizzo, aumentano l'affidabilità e offrono un dialogo più agevole con l'utilizzatore finale, rispetto all'equivalente apparecchio meccanico o elettromeccanico. Ma cosa accade quando la nostra micro-applicazione deve svolgere compiti ad elevata intensità di calcolo matematico? Spesso ci scontriamo con le limitazioni tipiche delle architetture a 8-bit, con la mancanza di acceleratori di calcolo, ridotta quantità di memoria e, ancor più spesso, limitazioni imposte dai tool di sviluppo (es. compilatori C).


In questo post vediamo, invece, come agevolmente il nostro compilatore open-source preferito, GNU GCC, dotato di una completa libreria di funzioni matematiche, svolge alcune operazioni trigonometriche e come, nell'esempio qui riportato, il nostro sistema operativo open-source preferito, Linux, ci supporta con disinvoltura.

Supponiamo di aver implementato il sistema che ho già descritto qui e ...procediamo per passi!

  • Editiamo il seguente programma sul nostro PC. Naturalmente il PC ospiterà una distribuzione Linux (es. Ubuntu) e, pertanto, potremo utilizzare gedit.

/* Semplice programma per generare */
/* una sinusoide a tre fasi        */

#include <stdio.h>
#include <math.h>

int main() {

    double step = 2.0f * M_PI / 360.0f;
    double angle = 0.0f;
    double f1 = 0.0f;
    double f2 = 2.094395f;
    double f3 = f2 * 2.0f;
    int i;
   
    for (i=0; i<360; i++) {
        printf("%f, %f, %f\n",
               sin(angle+f1),
               sin(angle+f2),
               sin(angle+f3)
              );
        angle = angle + step;
    }
    return 0;
}

  • Salviamo con il nome math.c
  • Compiliamo con arm-linux-3.4.2-gcc math.c -o math -lm
  • Apriamo una sessione di Terminal sul PC che utilizziamo come sistema di sviluppo per Linux Embedded.
  • Digitiamo: telnet 192.168.1.151 (indirizzo IP del target utilizzato nell'esempio) e accediamo ad una sessione bash sul target, grazie al server telnetd già operativo al boot.
  • A questo punto accediamo alla directory di sviluppo, fisicamente presente si sul PC, ma che è stata montata sul target grazie al server nfs, digitando il comando cd /mnt/develop/math.
  • Eseguiamo il nostro programma sul target con il comando ./math.
  • L'output del programma scorrerà sotto i nostri occhi ...e il gioco è fatto! La serie è stata prodotta ed è pronta per essere utilizzata in real time sul nostro computer Linux Embedded.

Per ulteriori dettagli sulla libreria matematica del linguaggio C, sulle funzioni supportate e sulle costanti definite, vi rimando alla pagina Wikipedia.

Qui Pianeta Terra, a presto.

Nessun commento:

Posta un commento