Linux Embedded 1/5 – Come configurare l’ambiente di sviluppo

[Voti: 25    Media Voto: 4.4/5]

Questo articolo è il primo di una serie che ha l’obiettivo di spiegare come si crea e si configura una distribuzione Linux minimale pensata per un sistema embedded. Inoltre, verrà spiegato come configurare l’ambiente di sviluppo per utilizzare le Qt Embedded e il debug remoto.

Più nel dettaglio i temi trattai saranno:

Come configurare l’ambiente di sviluppo

Nel campo dello sviluppo software per sistemi embedded solitamente c’è una netta distinzione tra il computer da cui si effettua lo sviluppo e la scheda o il sistema embedded dove verrà eseguito il software sviluppato.

Il primo viene chiamato sistema host mentre il secondo viene chiamato sistema target.

In pratica sul sistema host si sviluppa il software per il sistema target, dove poi verrà eseguito realmente.

In questo primo articolo vediamo come configurare il sistema host.

Cominciamo con il dire che come sistema host va bene un normale computer con processore x86. Per quanto riguarda il sistema operativo, invece, è consigliato se non addirittura necessario, in alcuni casi, utilizzare un S.O. Linux. Quindi si può scegliere di installare una distribuzione Linux pensata per il desktop come ad esempio Fedora o Ubuntu. Nel caso in cui non si voglia installare Linux sul proprio PC è sempre possibile utilizzare una macchina virtuale, ad esempio si può creare una macchina virtuale con una distribuzione Linux utilizzando un software di virtualizzazione come VMware Player o Virtualbox.

Una volta installata la distribuzione Linux sul sistema host si può procedere a configurarla per fare in modo che possa comunicare con il sistema target.

La comunicazione tra il sistema host e il target avviene tipicamente con le seguenti modalità:

  • attraverso un cavo seriale che collega la scheda al sistema host;
  • attraverso un cavo di rete;

La comunicazione seriale avviene per mezzo di un normale cavo seriale. Oramai i computer moderni non hanno più la porta seriale, quindi in questi casi si utilizza un adattaore da seriale a USB. Questi adattatori una volta collegati al sistema host vengono tipicamente identificati sotto linux con il nome di dispositivo /dev/ttyUSB0. Solitamente la connessione seriale viene utilizzata per interagire con la scheda quando questa non ha ancora a bordo la distribuzione target funzionante. In altri termini viene utilizzata ad esempio per scrivere nella memoria Flash della scheda il bootloader, configurare il bootloader, scrivere nella memoria flash il kernel e l’immagine del sistema. Può essere utilizzata anche una volta che il S.O. è stato avviato per accedere alla console di Linux e dare dei normali comandi all’interprete di comandi bash.

La comunicazione con cavo di rete viene utilizzata invece quando la distribuzione target è già in esecuzione sulla scheda o quando almeno il bootloader è funzionante. In questo caso il sistema host e la scheda target devono essere collegati in rete, o passando attraverso un apparato di rete come un hub, uno switch o un router, oppure direttamente con un cavo di rete cross. Perché possa avvenire la comunicazione, entrambi i S.O. dell’host e del target devono essere configurati con un indirizzo di rete appropriato. La connessione di rete inoltre viene utilizzata in fase di sviluppo per effettuare il boot da rete del kernel. In altre parole in questo scenario il kernel e il filesystem del sistema target, in fase di sviluppo, risiedono sul sistema host che li espone verso il computer target attraverso la rete. All’avvio della scheda target, il boot loader scarica in RAM il kernel condiviso dal sistema host attraverso il servizio TFTP e accede ai file del filesystem di rete NFS condiviso dal sistema host. Questa modalità di lavoro è particolarmente indicata per evitare, in fase di sviluppo, la continua riscrittura della memoria Flash del sistema target ad ogni ricompilazione di kernel o ad ogni modifica del filesystem.

Installare GtkTerm

GtkTerm è un semplice terminale per la comunicazione con la porta seriale. Per comunicare con la porta seriale, una volta installato GtkTerm sul sistema host, basta configurarlo con i parametri tipici di una connesione seriale ovvero:

  • la porta seriale come ad es. /dev/ttyUSB0
  • la velocità: es. 9600 baud
  • la parità: nessuna, pari, dispari
  • i bit di stop, il controllo del flusso, ecc.

Tutti i parametri di connessione vengono forniti dal produttore della scheda embedded utilizzata.

Con GtkTerm è possibile anche inviare un file al sistema target quando quest’ultimo è in attesa di riceverlo.

Configurare la rete

Sia che si utilizzi la configurazione a riga di comando con ifconfig o un’interfaccia grafica di configurazione come NetworkManager è necessario configurare la scheda di rete del sistema host in modo che abbia un indirizzo IP fisso e privato come ad esempio 192.168.0.1.

Inoltre dato che il sistema host dovrà esporre dei servizi di rete come TFTP o NFS al sistema target, è bene configurare il firewall in modo che apra le relative porte. Per semplicità, se l’ambiente di lavoro è sicuro, si può anche decidere di disabilitare il firewall del sistema host in modo completo.

Installare il supporto a TFTP

Il protocollo TFTP è solitamente utilizzato per inviare dei file alla scheda embedded target, come ad esempio il kernel quando si utilizza il boot da rete. TFTP è una versione semplificata del protocollo FTP che permette l’invio e la ricezione di soli file binari.

Quindi sul sistema host bisogna installare il server TFTP e, se non è già stato fatto, avviare il relativo servizio di sistema (es. service tftp start).

Di default, quando dal target si chiede di trasferire un file, il servizio TFTP cerca tale file nella directory /var/lib/tftpboot. Questo vuol dire che i file da trasferire sul sistema target, come ad esempio l’immagine del kernel, andranno copiati sul sistam host in questa directory. Per comodità si può creare un collegamento come ad esempio /tftpboot alla directory /var/lib/tftpboot.

Installare il supporto a NFS

Durante lo sviluppo del software per la scheda target il flusso di lavoro è il seguente:

  • si modifica il software;
  • si ricompila;
  • si prova il software sul sistema target;

Questo flusso viene eseguito più volte, se tutte le volte si dovesse rimpacchettare il filesystem del target e si dovesse riscrivere la flash della scheda, oltre all’evidente perdita di tempo, si rischierebbe di rovinare la memoria flash per le troppe riscritture.

Per questo motivo, in fase di sviluppo, si preferisce mantenere i file del filesystem del sistema target sul sistema host e esporli al sistema target attraverso un filesystem di rete come NFS. Ciò vuol dire che il sistema host espone una directory contente il file system del sistema target utilizzando il protocollo NFS, quando il kernel del target parte, monta la directory root / del suo filesystem direttamente sul file system di rete condiviso dall’host.

Detto questo quindi bisogna installare il servizio NFS sul sistema host, attivarlo in modo che parta all’avvio come un qualunque altro servizio e configurarlo.

La configurazione può avvenire ad esempio con il comando system-config-nfs. I parametri da indicare sono:

  • la directory che verrà condivisa. Es. /rootfs (se la directory non esiste va creata dall’utente root);
  • il permesso di accesso in lettura e scrittura a questa directory da qualsiasi sistema;
  • il flag “Treat remote root user as local root user”. Questo flag serve ad indicare che l’utente root del target potrà accedere ai file di questa directory esattamente come se fosse l’utente root del sistema host.

Ricapitolando quindi in fase di sviluppo l’immagine del kernel andrà posizionata nella directory /tftpboot mentre il filesystem del sistema target sarà creato e modificato sotto la directory /rootfs.

Garda Informatica

Garda Informatica

Garda Informatica sviluppa software su misura nella forma di Web Application, App Ibride per iOS/Android/Windows Phone, Crawler Web, Gestionali Web o semplici Connettori per l'integrazione tra software di terze parti.
Garda Informatica

3 commenti su “Linux Embedded 1/5 – Come configurare l’ambiente di sviluppo”

I commenti sono chiusi.