Esempio di Sviluppo per Raspberry Pi con Windows e Ubuntu

Lo sviluppo di applicazioni per Raspberry Pi è uno di quegli argomenti di cui si fa un gran discutere nei forum e nei gruppi di discussione in genere; tuttavia, predisporre un ambiente di sviluppo ben strutturato è uno dei passi fondamentali per produrre software in modo rapido ed efficace.

In questa sintetica guida ho voluto descrivere come predisorre un ambiente di svilupo, volutamente più complesso del necessario, che prevedesse l'uso di un PC Windows unicamente come workstation centrale, a favore di coloro che desiderano mantenre il proprio ambiente Desktop di Microsoft Windows. Tuttavia, sono profondamente convinto che lo sviluppo di software dovrebbe essere fatto in un ambiente quanto più omogeneo possibile. Come dire: se sviluppo software per GNU/Linux, uso tutti strumenti GNU/Linux; soprattutto voglio evitare il più possibile emulazioni di ogni tipo. A tale proposito ho voluto prevedere un sistema di sviluppo basato su Xubuntu, che nella fattispecie sarà virtualizzato con VirtualBox, che sarà equipaggiato con tutti gli strumenti necessari (compilatori, librerie, eccetera) per produrre eseguibili per architettura ARM in poco tempo e senza troppi inutili grattacapi.

Per facilità di consultazione, questa guida è suddivisa nelle seguenti sezioni:

  1. Introduzione
  2. Installazione dei Pacchetti Software Necessari
  3. Primo Test di Compilazione ed Esecuzione
  4. Conclusioni
  5. Note su Questo Post

1. Introduzione

Articoli di Riferimento

Al fine di una migliore comprensione di questa guida permettermi di suggerirti la lettura dei seguenti articoli, i quali ti potrebbero essere di aiuto se deciderai di replicare l'ambiente qui descritto.

Tuttavia, per una migliore comprensione dell'intero percorso di avvicinamento alla creazione di  un ambiente integrato per la compilazione di software per Raspberry Pi, direi che è molto utile includere anche:

Obbiettivo da Raggiungere

L'obbiettivo che questa guida intende raggiungere, consiste nel creare un ambiente di sviluppo eterogeneo con lo scopo finale di poter sviluppare software per Raspberry Pi (con processore RISC ed architettura ARM) tramite un sistema di sviluppo su sistema operativo GNU/Linux, senza rinunciare all'ambiente Microsoft Windows del proprio PC (con proessore CISC ed architettura X86) al quale molti sono ormai abituati e non intendono in alcun modo abbandonare del tutto.

L'ambiente di sviluppo che andrò ad illustrare è rappresentato schematicamente in questa immagine.

network diagram development

Tuttavia, l'immagine rapppresenta soltanto una struttura logica che ha bisogno di essere dettagliata in modo più approfondito per rappresentarla nel mondo reale.

Ebbene, queste sono le caratteristiche fisiche dell'ambiente, così come è stato effettivamente realizzato in laboratorio.

  • La LAN Laboratorio è effettivmente una Local Area Network che mette in comunicazione tutte le acchine. Essa è realizzabile anche trmite il LAN Switch a 4 porte, solitamente integrato nel Modem/Router che abiamo a casa pr collegarci con l'ADSL ad internet.
  • La macchina PC-Windows è un normale computer desktop (abbastanza recente) con un processore Intel i5 oppure i7, RAM quanto basta, 1 Hard Disk con diversi Gigabytes di spazio libero. Insomma, niente di speciale.
  • La macchina GNU/Linux (Ubuntu) è il vero motore del sistema di sviluppo. Tuttavia, questa non è una macchina fisica, bensì una macchina virtuale installata all'interno del PC-Windows in esecuzione all'interno dell'ambiente di virtualizzazione VirtualBox.
  • La macchina Raspberry Pi Versione 3B è il celeberrimo Single Board Computer da € 35, nel quale è stato preventivamente installato il sistema operativo Raspbian. Esso rappresenta la macchina "Target", ovvero quella dove sarà effettivamente mandato in esecuzione il software prodotto con la macchina di sviluppu GNU/Linux (Ubuntu).

E le frecce rosse nell'immagine, cosa sono? Presto detto!

Le linee rosse tratteggiate, e relative frecce, indicano le comunicazioni da macchina e macchina. Ma scendiamo nel dettaglio per capire un po meglio comequesto avviene e cosa significhino realmente

  • Dalla macchina PC-Windows ci collegheremo alla macchina (in questo caso "virtuale" ma potrebbe benissimo essere una macchina fisica) GNU/Linux (Ubuntu) utilizzando il Remote Desktop di Windows, che usa il protocollo RDP sulla porta TCP/3389. Attraverso questa soluzione, è possibile accedere al desktop della macchina GNU/Linux (Ubuntu) dal desktop del nostro PC-Windows,senza troppe complicazioni.
  • Dalla macchina PC-Windows Potremo collegarci al Raspberry Pi itilizzando il noto Tool PuTTY per Windows, che utilizza il protocollo SSH sulla porta TCP/22. Attraverso questa soluzione è possibile interagine con la macchina Raspberry Pi tramite linea di comando.
  • Dalla macchina GNU/Linux (Ubuntu) potremo eventualmente collegargi al Raspberry Pi con il protocollo SSH sulla porta TCP/22, per interagine tramite linea di comando. Potremoinltre utilizzare i protocolli SCP sulla porta TCP/22, FTP sulla porta TCP/21 ed il rotocollo RSYNC sulla porta TCP/873 per trasferire i files dalla macchina GNU/Linux (Ubuntu) al Raspberry Pi.

 

2. Installazione dei Pacchetti Software Necessari

2.1 Macchina PC-Windows

Potrebbe senz'altro esserci molto utile installare i seguenti software aggiuntivi nel nostro PC-Windows, per ragioni che saranno presto ben chiare.

  1. PuTTY - Software Open Source per la comunicazione tramite protocollo SSH, Telnet , emulazione Terminale su Porta Seriale (e non solo) in ambiente Microsoft Windows.
  2. XMing - Software di emulazione di X-Server per Windows; utile per esportare le singole finestre di un ambiente grafico GNU/Linux (Gnome, Xfce, ecc.) nell'ambiente grafico di Microsoft Windows.
  3. FileZilla - Software Client Open Source per la communicazione FTP (e non solo) in ambiente Microsoft Windows.
  4. VirtualBox - Software di virtualizzazione, la cui installazione e configurazione è ampiamente dettagliata in uno degli articoli menzionati più sopra, in questa guida.

2.2 Macchina GNU/Linux - Xubuntu

Essendo questa la vera e propria macchina di sviluppo, qui andremo ad installare i seguenti software:

  1. Openssh-Server - Per poter accedere da remoto alla riga di comando di questa macchina.
  2. Compilatore C/C++ - I Build Tools C/C++ per la compilazione del codice sia per architettura X86 che per ARM (in modo da poter creare codice per entrambe le architetture)
  3. CodeBloks - L'ambiente integrato per lo sviluppo (IDE - Integrated Development Environment) che utilizzeremo per sviluppare il codice.

2.2.1 installazione ed attivazione ssh

L'unico pacchetto da installare per attivare il servizio ssh è openssh-server; la cui installazione, da riga di comando, è di fatto molto semplice:

$ sudo apt-get install openssh-server

Al completamento dell'installazione di openssh-server, è verificare che l'installazione el pacchetto openssh-server abbia anche avviato ed attivato il servizio ssh.

$ sudo service ssh status
● ssh.service - OpenBSD Secure Shell server
   Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
   Active: active (running) since sab 2017-04-01 21:18:36 CEST; 2min 11s ago
 Main PID: 12956 (sshd)
   CGroup: /system.slice/ssh.service
           └─12956 /usr/sbin/sshd -D
apr 01 21:18:36 jeremy systemd[1]: Starting OpenBSD Secure Shell server...
apr 01 21:18:36 jeremy sshd[12956]: Server listening on 0.0.0.0 port 22.
apr 01 21:18:36 jeremy sshd[12956]: Server listening on :: port 22.
apr 01 21:18:36 jeremy systemd[1]: Started OpenBSD Secure Shell server.
apr 01 21:19:25 jeremy sshd[13050]: Accepted password for massimo from 192.168.0.200 port 33536 ssh2
apr 01 21:19:25 jeremy sshd[13050]: pam_unix(sshd:session): session opened for user massimo by (uid=0)
$

Il cui isultato, ci informa che il servizio ssh.service è running.

2.2.2 Installazione Compilatori C/C++ per X86 e ARM

2.2.2.1 pacchetti di build-essential per X86

Anche se non strettamente necessario per il cross compile, installeremo il necessario per compilare per X86 (ti potrebbe tornare utile comunque per eventuali compilazioni di codice per target nativo).
Il ché si traduce nell'installazione di una serie di pacchetti software raggruppati come build-essential,  la cui installazione può essere effettuata con questi semplici comandi da finestra terminale.

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install build-essential

... e sempre da terminale, verifica che il compilatore gcc sia correttamete eseguibile e quale sia la versione in uso, con il seguente comando

$ gcc --version
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$

Stessa cosa per il compilatore c++, con il seguente comando

$ c++ --version
c++ (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$

 Che corrispond esattamente a quanto atteso.

2.2.2.2 Pacchetti per il Cross-Compile ARM

Installiamo ora tutto il necessario per il cross-compile, con i seguenti comandi da terminale.

sudo apt-get install gcc-arm-linux-gnueabi
sudo apt-get install g++-arm-linux-gnueabi
sudo apt-get install binutils-arm-linux-gnueabi

Noterai, che non c'è un pacchetto software simile a build-essential per ARM, ma ciò che serve va installato manualmente pacchetto per pacchetto.

facciamo una rapida verifica del compilatore gcc:

$ arm-linux-gnueabi-gcc --version
arm-linux-gnueabi-gcc (Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$

Stessa cosa anche per il compilatore cpp:

$ arm-linux-gnueabi-cpp --version
arm-linux-gnueabi-cpp (Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$

2.2.3 Installazione dello IDE Code::Block

Procediamo ora con l'installazione dello IDE Code::Blocks per lo sviluppo, con il seguente comando da terminale

$ sudo apt-get install codeblocks

Che possiamo anche provare ad avviare da riga di comando:

$ codeblocks

... E se tutto è andato secondo le previsioni, Code::Blocks dovrebbe apparire sullo schermo in tutto il suo splendrore.

codeblocks ide

Ovviamente non sarà necessario avviare Code::Block ogni volta da riga di comando; noterai infatti che nel menu principale del desktop di Xubuntu, nella sezione Sviluppo, è ora disponibile  un nuovo elemento dedicato proprio all'avvio di Code::Blocks direttamente dall'ambiente grafico.

2.2.4 Configurazione della ToolChain di Code::Block

Ora che sono stati installati tutti gli strumenti necessari, è necessario configurare Code::Blocks in modo che i progetti che decideremo di compilare per i sistemi ARM (Raspberry Pi) vengano efettivamente compilati con il compilatore appropriato.

Per fare questo, dovrai avviare Code::Blocks (dal menu dell'interfaccia grafica di Xubuntu o da riga di comando) ed eseguire la seguente breve procedura:

Dalla barra di menu di Code::Blocks, clicca su: SettingsCompiler. Si aprirà la schermata relativa al settaggio dei parametri del compilatore.

codeblocks compiler settings

 

Quindi, nella sezione Selected compiler, clicca su Copy. Si aprirà una piccola schermata che ti permetterà di inserire un nuovo nome.

codeblocks compiler settings nuovo compiler

Inserisci il nuovo nome per questo settaggio: GNU GCC Compiler per ARM e clicca su OK, per tornare alla schermata precedente.

Qui assicurati che sia selezionato il nuovo compilatore appena creato e modifica i valori, come mostrato nella  figura seguente.

codeblocks compiler settings toolchain

Clicca su OK, per salvare e chiudere.

Ora sei pronto per creare il tuo primo programma da compilare ed eseguire su Raspberry Pi.

3. Primo Test di Compilazione ed Esecuzione

Puoi provare il tuo primo test di compilazione, creando un nuovo progetto di tipo Console Application con Code::Blocks e compilarlo per ARM utilizzando il setup di compilatore illustrato più sopra. Prova con il classico helloworld.c, per cominciare.

/* Hello World program */
#include <stdio.h>
main()
{
    printf("Hello World");
return 0; }

Una volta compilatoe linkato (completato il Build del projetto), trasferiscilo sul tuo Raspberry Pi ed eseguilo.

 

4. Conclusioni

Come vedi, anche se l'ambiente che ho voluto predisporre era volutamente più complesso del necessario, non è stato poi così complicato. Anzi, mi sentirei di dire l'esatto contrario.

L'enorme vantaggio dell'obbiettivo che abbiamo raggiunto, consiste nel fatto che l'ambiente di sviluppo appena realizzato è replicabile per qualsiasi altro tipo di sviluppo di software, non solo per Raspberry Pi. L'aver impiegato una macchina virtuale infatti ha ftto si che l'ambiente di sviluppo risultante sia estremamente flessibile, oltre che sicuro.

5. Note su questo Post

Questo post nasce dall'esigenza di rendere il più possibile fruibili, alcuni specifici argomenti squisitamente tecnici, che per via della loro natura necessitano di essere arricchiti da illustrazioni, approfondimenti, esempi, suggerimenti, commenti e quant'altro sia utile ad una chiara comprensione delle tematiche trattatate, ivi compresi, un linguaggio tecnico appropriato e l'impiego di link esterni a siti autoritativi di riferimento.

In particolar modo, questo post mira ad essere un supporto per gli studenti delle scuole di informatica che a vario titolo partecipano ad alcuni nostri progetti interni, i quali sono mirati ad una stretta collaborazione con le scuole nell'ambito della Alternanza Scuola Lavoro, del quale maggiori approfondimenti sono riportati alla pagina del Progetto Scuola.

Lascia un commento

Tutti i commenti dovranno essere verificati ed approvati dal webmaster, prima di essere pubblicati

 

Quote of the Day

Compiendo cose giuste diventiamo giusti, compiendo cose moderate diventiamo moderati, facendo cose coraggiose, coraggiosi.

Aristotele

Chi è online

Abbiamo 74 visitatori e nessun utente online

Newsletter

Per essere sempre aggiornato sulle ultime novità.

Go to top