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:
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.
<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>
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>
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.
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.
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.
/etc/hostname
și în /etc/hosts
.
.local
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.
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ă.
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.
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ă:
Host <alias> HostName <hostname> User <username>
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>
.
ssh <hostname>
.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:
Opțiuni și comenzi git:
git clone <repo>
- va aduce toate fișierele conținute de repository-ul repo pe mașina locală.git pull
- actualizează un repository deja clonat local la ultima versiune remote.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.git apply <patch file>
- aplică pe fișierele locale modificările conținute de fișierul 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:
diff <path A> <path B>
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:
patch < <patch file>
- va aplica modificările descrise de fișierul patch în directorul curentgit apply <patch_file>
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.
./configure
- generează Makefile-uri și configurează environment-ul pentru comanda make
make
- compilează surselemake install
- instalează utilitarul compilat în directorul configurat anterior și realizează orice alte modificări ale sistemului pentru ca utilitarul poată fi folosit/opt
. Modificați PATH-ul astfel încât să poată fi rulat din orice director apelând htop
și rulați-l în $HOME
.