Differences

This shows you the differences between two versions of the page.

Link to this comparison view

si:laboratoare:01 [2023/10/10 20:54]
florin.stancu
— (current)
Line 1: Line 1:
-===== Laboratorul 01. NuttX - Configurare și instalare ===== 
  
-Bine ați venit în laboratorul de Sisteme Embedded! 
- 
-Laboratorul își propune să vă familiarizeze cu sisteme embedded care rulează Linux și sisteme de operare RTOS precum NuttX care se pretează mai degrabă microcontrollerelor decât sistemelor de tip desktop. 
- 
-În acest laborator veți învăța cum să compilați și să încărcați sistemul de operare NuttX pe plăcile [[https://​github.com/​dantudose/​ESP32-Sparrow-rev2| ESP32 Sparrow]]. Aceste plăci sunt construite pornind de la un modul de ESP32 Wrover la care au fost adăugate: 
-  * un senzor de lumină - LTR308 
-  * un senzor de temperatură,​ umiditate și presiune - BME680 
-  * un display OLED cu rezoluția 128x32 - SSD1306 
-  * un microfon prin I2S 
-  * un cititor de carduri microSD 
- 
-Pentru a putea fi folosit pe microcontrollere,​ NuttX are un memory-footprint foarte scăzut (de ordinul câtorva sutelor de kilobytes). Un alt feature care îl face potrivit sistemelor low-end este faptul că nu folosește mecanismele de memorie virtuală în mod implicit, acest mod de operare numindu-se flat-mode addressing. 
- 
-{{ :​si:​laboratoare:​esp32_sparrow.jpg?​600 |}} 
- 
-===== Setup ===== 
- 
-==== Linux ==== 
- 
-Dacă rulați pe un sistem cu Linux nativ, continuați de la pasul [[01#​compilarea_si_incarcarea_pe_placa|Compilarea și încărcarea pe placă]]. 
- 
-==== Windows ==== 
- 
-Pentru a putea rula pe Windows, va trebui să vă configurați o mașină virtuală de Linux prin care să aveți acces la porturile USB ale host-ului - astfel conectarea la placă se va face direct prin USB de pe mașina virtuală. Pentru instalarea Linuxului puteți folosi [[https://​repository.grid.pub.ro/​cs/​so/​linux-2021/​so-ubuntu-20-04.ova|mașina virtuală]] de la SO din anul 3 - este suficient să aveți un sistem Linux minimal, doar din linie de comandă. Alternativ, puteți instala orice altă distribuție de Linux (Ubuntu, Linux Mint, etc.). 
- 
-Pentru a instala mașina virtuală, este recomandat să folosiți [[https://​vmware.pub.ro/​|VMware Workstation 16 pro]], deoarece este foarte ușor de configurat. 
- 
-Dacă nu aveți acces la VMware (nu aveți licență), puteți să folosiți și [[https://​www.virtualbox.org/​|VirtualBox]],​ dar cu niște pași în plus pentru a-l configura. 
- 
-În mod normal, o mașină virtuală prin VirtualBox nu este accesibilă direct de pe host. Totuși, pentru a vă putea conecta la mașina virtuală prin SSH (folosind [[https://​mobaxterm.mobatek.net/​|MobaXterm]],​ de exemplu), puteți urmări pașii de mai jos: 
-  * intrați în setările mașinii virtuale și adăugați a 2a interfață de rețea. Prima va fi o interfață host-only pentru a permite conectivitatea de la host la guest (ssh), iar a 2a interfață va fi sub un NAT pentru a putea avea acces la internet. 
-  * porniți mașina virtuală. Testați cu ''​ping 8.8.8.8''​ că sunteți conectat la Internet. 
-  * adăugați o adresă IP statică pe a 2a interfață folosind subrețeaua ''​192.168.56.0/​24''​. De exemplu, puteți folosi ''​192.168.56.56/​24''​. Alternativ, puteți configura un client de DHCP. 
- 
-Pentru a putea avea acces la portul USB direct din mașina virtuală, din bara de sus selectați ''​Devices''​ > ''​USB devices''​ > ''​controller-ul UART''​. 
- 
-Momentan WSL-ul nu are suport nativ pentru interacțiunea cu diferite device-uri peste USB. Dacă doriți să folosiți totusi WSL, puteți folosi acest [[https://​learn.microsoft.com/​en-us/​windows/​wsl/​connect-usb|tool]] open source. 
- 
-==== MacOS ==== 
- 
-Pentru a rula pe MacOS puteți urmări tutorialul de [[https://​github.com/​robertalexa2000/​nuttx-esp32-docs/​blob/​si_labs/​bringup/​macos_tutorial.md|aici]]. 
- 
-===== Compilarea și încărcarea pe placă ===== 
- 
-Pașii de mai jos trebuie urmați ca utilizator privilegiat (root): 
-  * instalarea pachetelor (dependințelor) pe Linux 
-  * descărcarea unui compilator (toolchain),​ deoarece arhitectura target este Xtensa, deci nu putem compila cu gcc-ul default de pe distribuțiile de Linux x86 
-  * descărcarea repository-urilor de NuttX: nuttx, apps 
-  * descărcarea tabelei de partiții și a bootloader-ului. Acestea sunt precompilate pentru fiecare release (versiune) de NuttX, însă pot fi compilate și din linie de comandă. 
-  * compilarea în urma căreia va rezulta un binar 
-  * încărcarea binarului pe placă 
- 
-Dacă doriți să continuați ca utilizator neprivilegiat,​ puteți consulta tutorialul de [[https://​blog.espressif.com/​getting-started-with-esp32-and-nuttx-fd3e1a3d182c|aici]]. 
- 
-==== Instalarea pachetelor lipsă ==== 
- 
-<​code>​ 
-apt-get update 
-apt-get upgrade -y 
-apt-get install -y bison flex gettext texinfo libncurses5-dev libncursesw5-dev gperf automake libtool pkg-config build-essential gperf genromfs libgmp-dev libmpc-dev libmpfr-dev libisl-dev binutils-dev libelf-dev libexpat-dev gcc-multilib g++-multilib picocom u-boot-tools util-linux chrony libusb-dev libusb-1.0.0-dev kconfig-frontends python3-pip 
-</​code>​ 
- 
-==== Descărcarea toolchain-ului ==== 
- 
-<​code>​ 
-wget https://​github.com/​espressif/​crosstool-NG/​releases/​download/​esp-12.2.0_20230208/​xtensa-esp32-elf-12.2.0_20230208-x86_64-linux-gnu.tar.xz 
-tar -xf xtensa-esp32-elf-12.2.0_20230208-x86_64-linux-gnu.tar.xz 
-mkdir /opt/xtensa 
-mv xtensa-esp32-elf/​ /​opt/​xtensa/​ 
-echo "​export PATH=\$PATH:/​opt/​xtensa/​xtensa-esp32-elf/​bin"​ >> ~/.bashrc 
-source ~/.bashrc 
-</​code>​ 
- 
-==== Descărcarea repository-urilor ==== 
- 
-<​code>​ 
-mkdir ~/​nuttxspace && cd ~/​nuttxspace 
-git clone https://​github.com/​apache/​incubator-nuttx.git nuttx 
-git clone https://​github.com/​apache/​incubator-nuttx-apps.git apps 
-</​code>​ 
- 
-<note tip> 
-NuttX folosește 2 directoare separate: 
-  * nuttx, care conține sistemul de operare: scheduler, drivere, sisteme de fișiere, etc. 
-  * apps, care conține aplicațiile. 
- 
-Una din etapele compilării presupune ca sistemul de build să creeze o bibliotecă statică denumită ''​libapps.a''​ care va fi adăugată la binarul de NuttX în etapa de linking. 
-</​note>​ 
- 
-==== Descărcarea tabelei de partiții și a bootloader-ului ==== 
- 
-<​code>​ 
-mkdir esp-bins 
-curl -L "​https://​github.com/​espressif/​esp-nuttx-bootloader/​releases/​download/​latest/​bootloader-esp32.bin"​ -o esp-bins/​bootloader-esp32.bin 
-curl -L "​https://​github.com/​espressif/​esp-nuttx-bootloader/​releases/​download/​latest/​partition-table-esp32.bin"​ -o esp-bins/​partition-table-esp32.bin 
-</​code>​ 
- 
-==== Compilarea și rularea ==== 
- 
-<​code>​ 
-pip3 install esptool 
-pip3 install pyserial 
-cd ~/​nuttxspace/​nuttx 
-./​tools/​configure.sh -l esp32-sparrow-kit:​nsh 
-make -j4 
-esptool.py erase_flash 
-make flash ESPTOOL_PORT=/​dev/​ttyUSB0 ESPTOOL_BAUD=115200 ESPTOOL_BINDIR=../​esp-bins 
-</​code>​ 
- 
-<​hidden>​Uneori mai sunt push-uite modificari la sistemul de build si este nevoie sa iti faci update la cross-compiler,​ de exemplu. Sansele sunt mici sa se fi modificat ceva de saptamana trecuta pana acum, dar just in case eu am testat codul pe v12.2.1, commit-urile:​ 
-  - nuttx: dc096f951e482a7c3061288213ff0b3209afffcd 
-  - apps: a48810f4a58efdae1cc0bb1981825721fdd93d9a ​ 
-</​hidden>​ 
- 
-În functie de tipul de placă pe care rulați, este posibil să fie nevoie să apăsați butonul de ''​BOOT''​ (''​IO0''​) atunci când încărcați NuttX. Astfel, placa intră în modul de "​Download"​ - în mod normal, placa este în starea de "​Boot"​. Butonul trebuie apăsat doar atunci când se încearcă stabilirea conexiunii cu firmware-ul de pe ESP32, așa cum se poate vedea mai jos: 
- 
-{{ :​si:​laboratoare:​nuttx_download_mode.png |}} 
- 
-Pentru a vă conecta la placă veți folosi ''​picocom /​dev/​ttyUSB0 -b 115200''​. 
- 
-În cazul în care sistemul de build nu detectează în mod automat calea către repo-ul de apps, aceasta poate fi specificată prin ''​-a <​path>''​. Pentru toți parametri disponibili puteți folosi ''​./​tools/​configure.sh -h''​. Alternativ, calea către directorul de apps poate fi configurată prin ''​CONFIG_APPSDIR''​. 
- 
-Dacă compilați pentru un alt tip de placă ESP32 - pentru un modul WROOM, de exemplu - trebuie să folosiți ''​./​tools/​configure.sh esp32-devkitc:​nsh''​. De asemenea, deoarece plăcile Sparrow sunt construite peste modulul WROVER, puteți să folosiți și ''​./​tools/​configure.sh esp32-wrover-kit:​nsh''​. Însă în acest caz va trebui să configurați manual NuttX-ul prin ''​make menuconfig''​ astfel încât să aveți acces la componentele hardware adăugate pe Sparrow. 
- 
-Încărcarea binarului pe placă se poate face și prin ''​esptool.py --chip esp32 --port /​dev/​ttyUSB0 --baud 921600 write_flash 0x1000 ../​esp-bins/​bootloader-esp32.bin 0x8000 ../​esp-bins/​partition-table-esp32.bin 0x10000 nuttx.bin''​. 
- 
-Dacă nu aveți erori, ar trebui să vă apară un log asemănător cu cel de mai jos: 
- 
-{{ :​si:​laboratoare:​nuttx_flash_log.png?​750 |}} 
- 
-În final, ar trebui să obțineți și un log de boot asemănător cu cel din screenshot-ul atașat: 
- 
-{{ :​si:​laboratoare:​nuttx_boot_log.png?​600 }} 
- 
-===== Exerciții ===== 
- 
-**1.** Folosind sistemul de build al NuttX, activați compilarea aplicației "​Hello,​ World!"​. Codul sursă îl puteți găsi în ''​apps/​examples/​hello''​. Odată încărcat pe placă, rulați aplicația din linie de comandă. 
- 
-<note tip> 
-  * pentru a putea compila "​Hello,​ World!"​ trebuie să activați config-ul ''​CONFIG_EXAMPLES_HELLO''​ folosind ''​make menuconfig''​. Căutarea unui anume config se poate face la fel ca in VIM, folosind ''/''​ urmat de string-ul dorit. 
-  * odată compilat și încărcat NuttX, utilizați comanda ''?''​ pentru a vedea cum se poate rula aplicația. 
-</​note>​ 
- 
-**2.** Asemănător exercițiului anterior, compilați și încărcați aplicația "​rgbled"​. 
- 
-<note tip> 
-E nevoie de activarea config-ului ''​CONFIG_EXAMPLES_RGBLED''​. Pentru a putea vedea cum NuttX compilează selectiv, doar pe baza config-urilor activate, vă puteți uita in fișierele ''​Kconfig''​. 
-</​note>​ 
- 
-<note important>​ 
-Dacă rulați pe plăcuțele verzi, trebuie să schimbați pinii LED-ului: 
-  * CONFIG_ESP32_LEDC_CHANNEL0_PIN=25 
-  * CONFIG_ESP32_LEDC_CHANNEL1_PIN=26 
-  * CONFIG_ESP32_LEDC_CHANNEL2_PIN=27 
-</​note>​ 
- 
-**3. Bonus - ** faceți led-ul să clipească o dată pe secundă in roșu, verde, albastru. 
- 
-===== Resurse ===== 
-  * [[https://​nuttx.apache.org/​docs/​latest/​|Documentatia oficiala NuttX]] 
-  * [[https://​en.wikipedia.org/​wiki/​Cross_compiler| What is a cross-compiler?​]] 
-  * [[https://​docs.espressif.com/​projects/​esp-idf/​en/​latest/​esp32/​api-guides/​tools/​idf-tools.html| ESP32 toolchain]] 
-  * [[https://​www.environmentallights.com/​library/​pwm| PWM and LEDs]] 
si/laboratoare/01.1696960481.txt.gz · Last modified: 2023/10/10 20:54 by florin.stancu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0