Table of Contents

Introducere

Bine ați venit în laboratorul de Sisteme Embedded!

Laboratorul își propune să vă familiarizeze cu sisteme embedded care rulează Linux, de la dezvoltare și configurare, până la mentenanță. Vom trata subiecte precum:

De ce Linux?

Sistemele Linux oferă o mulțime de avantaje dezvoltatorilor de produse, care micșorează timpul de dezvoltare, lucru care este din ce în ce mai important în zilele noastre:

De-a lungul anilor Linux a devenit cel mai folosit sistem de operare pentru aplicațiile embedded. Îl puteți găsi folosit în orice:

După cum se poate vedea, sistemele embedded diferă foarte mult în dimensuni și putere de procesare, unele dintre ele apropiindu-se chiar de puterea de procesare a unui calculator obișnuit. De asemenea, aplicațiile pe care acestea le rulează pot fi foarte variate (ex: smartphone), amestecând diferențele dintre un calculator obișnuit și un sistem embedded. Un lucru care deosebește însă sistemele embedded este modul de interacțiune cu utilizatorii, care foarte rar se face printr-un ecran și o tastatură. Lipsa unui mod tradițional de interacțiune cu utilizatorul este și ceea ce face dezvoltarea unui sistem embedded mai grea, dar și mai interesantă.

Cele mai întâlnite două metode de interacțiune cu un sistem embedded în timpul dezvoltării sunt: consola serială și conexiunea SSH. Dintre acestea, conexiunea SSH este metoda mai robustă și mai simplu de utilizat, însă ea e disponibilă doar pe sistemele care dispun de o interfață de rețea. Consola serială, însă este de obicei prezentă pe orice sistem și permite interacțiunea cu sistemul chiar și înainte ca interfața de rețea să fie disponibilă (ex: în bootloader sau înainte de ințializarea driver-ului de rețea).

Există două concepte importante folosite în dezvoltarea unui sistem embedded: target și host. Target-ul este reprezentat de sistemul embedded pe care îl dezvoltăm și la care ne conectăm (ex: RaspberryPi, Intel Galileo etc.). Host-ul este reprezentat de calculatorul pe care îl folosim pentru dezvoltare și prin care ne conectăm cu sistemul embedded. Host-ul beneficiază de obicei de o putere de procesare mult mai mare, care micșorează de exemplu timpul de compilare în comparație cu compilarea pe target.

RaspberryPi

<imgcaption image1 | RaspberryPi Model B></imgcaption>

Vom lucra în principal cu RaspberryPi 3, un sistem de calcul bazat pe un procesor “System on Chip” ARM de la Broadcom. Specificațiile complete sunt:

<imgcaption image2 | Schema perifericelor RaspberryPi> </imgcaption>

Schema bloc

Din punct de vedere hardware, RaspberryPi este un dispozitiv simplu, care expune diferitele periferice pe care le oferă SoC-ul Broadcom. Singura excepție o reprezintă Hub-ul USB, care dublează numărul de porturi USB disponibile și atașează și un dispozitiv Ethernet la SoC-ul Broadcom.

<imgcaption image3 | Diagrama bloc > </imgcaption>

<imgcaption image4 | Diagrama block a chip-ului de USB și Ethernet>  </imgcaption>

1. Pornirea RaspberryPi

Verificați că aveți:

Pentru a porni plăcuța:

ip l | grep 'state UP' # discover Y
sudo ip a a 10.0.0.10X/24 dev Y:0 # X e numarul placii voastre si Y e interfata de net conectata la retea

Pentru reamintirea modului de funcționare a unui shell Linux revedeți laboratorul de USO - Automatizare în linia de comandă. Pentru o recapitulare a modului de configurare a rețelei în Linux puteți consulta laboratoarele de USO - Configurări de rețea sau RL - Adresare IP și rutare în Linux.

2. Conectarea la RaspberryPi și acces Internet

Conectarea se va face folosind SSH, username pi și parolă raspberry și cu IP-ul 10.0.0.x, unde x este numărul scris pe cardul SD al fiecărei plăci.

La ruta default nu e nevoie de mască de rețea

Hint: schimbați și în /etc/hostname și în /etc/hosts.

Conectarea la RaspberryPi, de acum încolo, se poate face simplu, folosind SSH și numele plăcii și adăugând la sfârșit .local

3. Autentificare prin chei asimetrice

Cum nu ne dorim să scriem parola de fiecare dată când vrem să copiem sau să ne logăm pe un anumit device, deoarece se pierde foarte mult timp, vom folosi autentificarea prin chei asimetrice.

Comanda de generare este ssh-keygen

Astfel, vom genera două chei, una publică, pe care o vom copia pe device-ul unde dorim să ne conectăm, și una privată.

Comanda de copiere este ssh-copy-id <username>@<hostname>

După ce comanda este executată cu succes, vă veți putea loga pe device sau veți putea transfera fișiere de la/la device fără a vi se cere parola.

4. Fișier de configurare pentru ssh

Pentru a ne ușura și mai mult munca și pentru a nu mai trebui să introducem username-ul în comanda de ssh/scp, putem folosi fișierul de configurare al SSH: $HOME/.ssh/config. Acesta are următoarea sintaxă:

$HOME/.ssh/config
Host <alias>
        HostName <hostname>
        User <username>

Pentru ca fişierul de configurare să fie citit de clientul de SSH el trebuie să aibă doar permisiuni de read şi write și numai pentru user.

Astfel, când o comandă ssh pi este rulată, se va parsa fișierul de configurare și se va căuta pi printre alias-urile definite. Dacă este găsit, comanda va fi transformată automat în ssh <username>@<hostname>.

5. Instalare pachete/programe din surse

De multe ori ne lovim de problema instalării unui pachet sau a unui program pe care îl găsim doar pe un repository public, de cele mai multe ori bazat pe Git. Astfel, pentru a ne putea folosi de acel pachet/program, trebuie să cunoaștem următoarele utilitare:

Git

Opțiuni și comenzi git:

  1. git clone <repo> - va aduce toate fișierele conținute de repository-ul repo pe mașina locală.
  2. git pull - actualizează un repository deja clonat local la ultima versiune remote.
  3. git checkout <branch> sau git checkout <tag> - actualizează fișierele locale la versiunea indicată de branch sau de tag. Un repository poate avea mai multe branch-uri, care pot fi văzute ca niște versiuni diferite ale repository-ului. Un exemplu uzual de folosire a branch-urilor este pentru organizarea diferitelor versiuni ale aceluiași program.
  4. git apply <patch file> - aplică pe fișierele locale modificările conținute de fișierul patch.

diff și patch

diff este un utilitar cu care se pot afișa diferențele dintre două fișiere. De altfel, el poate fi folosit și pentru a genera un fișier patch cu acele diferențe. Un fișier patch descrie modificările care trebuie făcute asupra unui fișier sau director pentru a se ajunge dintr-o starea A într-o altă stare B. În lumea Linux există două modalități mai importante de a genera un patch:

  1. utilitarul diff: diff <path A> <path B>
  2. utilitarul Git: git diff <path> - afișează diferențele dintre versiunea salvată pe disc (starea B) și versiunea nemodificată, memorată de repository (starea A)

și respectiv două modalități de a aplica acest patch:

  1. utilitarul patch: patch < <patch file> - va aplica modificările descrise de fișierul patch în directorul curent
  2. utilitarul Git: git apply <patch_file>

config/make/make install

Dupa parcurgerea pașilor anteriori, rezultatul va fi un director în care se vor afla sursele și cel mai probabil un fișier de tip Makefile și un script de configurare. Pentru folosirea utilitarului trebuie executați trei pași: configurare, compilare și instalare. Acești trei pași sunt comuni majorității programelor din mediul Linux distribuite sub formă de surse.

  1. ./configure - generează Makefile-uri și configurează environment-ul pentru comanda make
  2. make - compilează sursele
  3. make install - instalează utilitarul compilat în directorul configurat anterior și realizează orice alte modificări ale sistemului pentru ca utilitarul poată fi folosit

  1. nu dorim suport pentru Unicode
  2. instalați cu ncurses, versiunea pentru development (libncurses5-dev)

Resurse

Referințe