User Tools

Site Tools


lab:2015:intro

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:

  • Rularea/Compilarea de aplicații pe un sistem embedded
  • Bootloadere, Kernel, Root FS, Toolchain
  • Instalarea și configurarea de servicii
  • Construirea unei distribuții Linux pentru sisteme embedded
  • Dezvoltarea de module kernel pentru lucrul cu hardware specializat
  • Emularea sistemelor

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:

  • versatilitate: Sistemele Linux nu trebuie să fie single-purpose, se pot adăuga multiple funcționalități cu ușurință (chiar și în etapa de post-producție)
  • codebase mare: Sistemele Linux abundă de aplicații user-space, drivere pentru o mulțime de dispozitive, suport pentru multe protocoale/sisteme de fișiere/etc.
  • securitate: Sistemele care folosesc servicii comune în Linux beneficiază de același nivel de securitate ca pe un sistem desktop sau server

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

 Fig. 1: RaspberryPi Model B

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

  • procesor ARM11 700MHz, cu GPU, 512MB RAM
  • 2 porturi USB
  • 1 conector Ethernet
  • card SD
  • HDMI, jack audio, RCA
  • Diverse alte periferice: GPIO, UART-uri, I²C, SPI, I²S

 Fig. 2: Schema perifericelor RaspberryPi

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.

 Fig. 3: Diagrama bloc

 Fig. 4: Diagrama block a chip-ului de USB și Ethernet

1. Pornirea RaspberryPi

Verificați că aveți:

  • plăcuța
  • alimentator cu mufă micro-USB
  • cablu Ethernet
  • card SD

Pentru a porni plăcuța:

  • Introduceți cardul SD, dacă nu este deja pus
  • Cuplați cablul de Ethernet
  • Rulati comenzile
sudo mount /home/student/rpi/*.img /home/student/export/nfs
sudo exportfs *:/home/student/export/nfs -o no_root_squash,rw
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
  • Alimentați placa
  • Rețineți numărul plăcii, așa cum este scris pe cardul SD

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.

  • Pentru ca placa să aibă conexiune la Internet, trebuie configurat încă un IP, pe o subinterfață (pe langă cel cu 10.0.0.x), care să permită comunicarea cu gateway-ul folosit și de calculatoarele din laborator . Aveți grijă, IP-ul nou trebuie să fie in aceeași rețea cu calculatoarele din laborator pentru aceasta.
  • De altfel, adăugați și rută default și verificați că aveți setat un server de DNS.

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

  • Schimbați-vă hostname-ul cu unul ales de voi, deoarece toate plăcile au default același hostname.

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

  • Pentru a facilita lucrul cu dispozitivele din rețeaua laboratorului, o bună abordare este de a instala Avahi. Acesta reprezintă o modalitate, sub formă de linux daemon, de service-discovery într-o rețea locală. Fiecare dispozitiv are asociat un nume (hostname) și va putea fi identificat cu ajutorul acestuia în interiorul rețelei.
  • Instalați daemon-ul de Avahi pe plăcuță

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.

  • Realizați conexiunea la plăcuță folosind doar hostname-ul și autentificarea prin chei asimetrice.

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>.

  • Realizați un fișier de configurare pentru SSH, care să vă permită conectarea cu ssh <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>
  • Clonați repository-ul utilitarului htop de pe GitHub, apoi actualizați fișierele locale la versiunea indicată de tag-ul 1.0.3, iar pe urmă aplicați patch-ul peste această versiune.

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
  • Configurați și instalați htop pe RaspberryPi, în /opt. Modificați PATH-ul astfel încât să poată fi rulat din orice director apelând htop și rulați-l în $HOME.

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

Resurse

Referințe

lab/2015/intro.txt · Last modified: 2017/10/04 21:13 by Dan Dragomir