PortuxG20 Embedded Linux Getting Started – Parte 2

PortuxG20_ImagePost2

In questo articolo proviamo a far "girare" la nostra prima, semplice applicazione sulla scheda Linux PortuxG20. Ci serviremo di alcuni strumenti di connettività tipici del mondo Linux, quali: un client ssh, il servizio nfs e molto altro. Inizieremo ad esplorare le tante funzionalità che tale prodotto ci offre.

Nel precedente articolo, che trovate qui, abbiamo compilato un semplice programma di test hello.c.

Nulla di complicato, è il solito Hello World! di prassi, che ci occorre per verificare il buon funzionamento di tutti gli elementi della catena di sviluppo.

 

Immagine della scheda con i collegamenti esterni

Immagine della scheda PortuxG20 con alcune connessioni:(dal basso) PenDrive USB, Alimentazione, Porta DBGU, Ethernet(sulla destra) la griglia di pin di I/O, 4xUSART, SPI, TWI, ecc.

Il nostro scopo, ora, è quello di eseguire il programma (in codice nativo ARMv5) sulla scheda target, quindi procediamo per passi.

  1. Copiamo il file hello (digitiamo proprio così, senza alcuna estensione) su di una pen-drive USB, utilizzando il comando cp hello /media/<id pen-drive>
  2. Inseriamo la pen-drive nel primo slot USB Host della scheda PortuxG20
  3. Digitiamo, sul target, il comando df –ha (h sta per human! – a sta per all) e verifichiamo che la pen-drive sia visibile nel file-system.

Dovremmo vedere un report simile:

Filesystem                Size      Used Available Use% Mounted on

/dev/root                 1.8G     66.2M      1.6G   4% /

proc                         0         0         0   0% /proc

sysfs                        0         0         0   0% /sys

none                     30.2M     68.0K     30.1M   0% /dev

devpts                       0         0         0   0% /dev/pts

usbfs                        0         0         0   0% /proc/bus/usb

tmpfs                    30.2M     32.0K     30.2M   0% /var/volatile

tmpfs                    30.2M         0     30.2M   0% /dev/shm

tmpfs                    30.2M         0     30.2M   0% /media/ram

/dev/mmcblk0p1            1.8G     66.2M      1.6G   4% /media/mmcblk0p1

/dev/sda1               974.5M     25.5M    949.0M   3% /media/sda1

Digitiamo cd /media/sda1 e poi ./hello

L’output del nostro primo programma sarà:

Hello!

Benissimo, funziona tutto! In effetti, però, non utilizzeremo questo metodo di lavoro durante lo sviluppo del codice. Non lo utilizzeremo poiché risulterebbe estremamente noioso trasferire ogni volta l’eseguibile mediante un device USB, mentre è un ottimo metodo per l'aggiornamento "sul campo". Desideravo, comunque, farvi prendere visione dei device di archiviazione, montati sul sistema. Avrete notato certamente /dev/root da 1.6Gigabyte disponibili e /var/volatile …una porzione della memoria RAM disponibile per file temporanei e dati variabili.

Il metodo canonico, invece, è il seguente …ve lo descrivo per passi successivii:

(Nota: tutti i comandi sono rivolti al PC Netbook con una release Ubuntu installata e con diritti di amministratore, salvo quando diversamente specificato. La scheda PortuxG20 e il PC Netbook, sono connessi mediante un cavo Ethernet diretto -cross- oppure mediante Router e che gli indirizzi IP sono 192.168.0.3  per PortuxG20 e 192.168.0.4 per PC Netbook)

 

1) Installare sul PC un server nfs con il comando apt-get install nfs-kernel-server

2) Creare una directory di lavoro quale ad esempio /develop

3) Assegnare ampi diritti di accesso alla nuova directory con chmod 777 /develop

4) Editare il file /etc/exports e inserire la riga /develop 192.168.0.* /ro

5) Effetture il restart del server nfs con /etc/init.d/nfs-kernel-server restart

6) Digitare sulla scheda PortuxG20 il comando mkdir /mnt/develop

7) Digitare sulla scheda PortuxG20 il comando mount -t nfs -o nolock,tcp 192.168.0.4:/develop /mnt/develop (192.168.0.4 è l’indirizzo IP del PC Netbook!!!)

8) Digitare sulla scheda PortuxG20 il comando cd /mnt/develop

9) Digitare …finalmente… sulla scheda il comando ./hello

 

L’output del nostro programma sarà sempre Hello!, ma questa volta stiamo utilizzando una directory condivisa tra il target e l’host di sviluppo. Quindi, il processo di edit, compilazione e test, risulterà enormemente velocizzato e ogni modifica potrà essere immediatamente provata sul target, senza scrivere in alcuna memoria flash, fissa o rimovibile che sia …niente male eh?

Bene, adesso che siamo in grado di sviluppare e “testare” mediante il link ethernet, proviamo a eliminare anche la connessione con la porta RS232 DBGU (Debug Unit).

Il nostro PC Netbook dovrebbe già contenere un client ssh (altrimenti lo installiamo con il comando sudo apt-get install ssh-client) e quindi possiamo subito provare a digitare il seguente comando:

ssh root@192.168.0.3

(la prima volta rispondiamo yes a tutte le domande, per accettare la chiave crittografica)

e, poi, digitiamo la password di default della scheda PortuxG20, che è taskit, ottenendo il prompt della scheda root@portuxg20#  …siamo all’interno del nostro host embedded… fantastico! Avendo una connessione ssh potremo, in futuro, utilizzare anche il comando scp (copia un file via secure shell non interattiva) digitando ad esempio scp hello root@192.168.0.3:/var/volatile

Per completare la configurazione del nostro sistema consiglio di installare anche l'utility make sul nostro PC, con il comando apt-get install build-essential, ciò consentirà di automatizzare il processo di compilazione e link, e d’ora in avanti potremo sviluppare ed eseguire i nostri programmi, solo mediante un economico PC Netbook con Linux Ubuntu che ci farà da host.

Non ci resta che mettere subito all’opera i controller GPIO e leggere o comandare, qualche segnale esterno, emulando magari un PWM trifase, oppure utilizzare i quattro canali analogici a 10bit resi disponibili dal blocco ADC del microprocessore o, infine, interfacciare qualche periferica mediante il bus asincrono PXB. Per tutto ciò dovremo utilizzare i segnali presenti sul retro della scheda, organizzati in modo da poter montare un unico connettore DIN41612 oppure una serie di connettori IDC. Il manuale tecnico della scheda, unitamente al data sheet del microprocessore AT91SAM9G20, ci faranno da guida, indicandoci tutti gli indirizzi fisici dei blocchi funzionali (es. USART, Timer, SPI, TWI, TC, ecc,) e, quindi, dei registri interni. Ricordiamo solo che tali indirizzi fisici dovranno essere "mappati" con mmap() altrimenti otterremo l'orrifico messaggio "Segmentation fault". Il Kernel Linux, infatti, utilizza un metodo di "memoria virtuale" che limita l'accesso alle locazioni di memoria non registrate e, ciò, lo rende anche estremamente stabile e protetto.

A presto, Ciro.

 

Leave a Reply