This shows you the differences between two versions of the page.
|
si:laboratoare:01 [2023/10/02 20:51] dan.tudose [Linux] |
— (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_placuta|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 plăcuță 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 niste 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 plăcuță ===== | ||
| - | |||
| - | 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 plăcuță | ||
| - | |||
| - | 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> | ||
| - | |||
| - | În functie de tipul de plăcuță 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, plăcuța intră în modul de "Download" - în mod normal, plăcuța 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 placuță 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 plăcuță ESP32 - pentru un modul WROOM, de exemplu - trebuie să folosiți ''./tools/configure.sh esp32-devkitc:nsh''. De asemenea, deoarece plăcuțele 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 plăcuță 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 plăcuță, 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]] | ||