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 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 128×32 - 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.

Setup

Linux

Dacă rulați pe un sistem cu Linux nativ, continuați de la pasul 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 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 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 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 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 tool open source.

MacOS

Pentru a rula pe MacOS puteți urmări tutorialul de 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 aici.

Instalarea pachetelor lipsă

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

Descărcarea toolchain-ului

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

Descărcarea repository-urilor

mkdir ~/nuttxspace && cd ~/nuttxspace
git clone --branch=nuttx-12.5.1 https://github.com/apache/incubator-nuttx.git nuttx
git clone --branch=nuttx-12.5.1 https://github.com/apache/incubator-nuttx-apps.git apps

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.

Descărcarea tabelei de partiții și a bootloader-ului

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

Compilarea și rularea

pip3 install esptool
pip3 install pyserial
cd ~/nuttxspace/nuttx
./tools/configure.sh -l esp32-sparrow-kit:nsh
make EXTRAFLAGS="-DESP32_IGNORE_CHIP_REVISION_CHECK" -j4
esptool.py erase_flash
make flash ESPTOOL_PORT=/dev/ttyUSB0 ESPTOOL_BAUD=115200 ESPTOOL_BINDIR=../esp-bins

Oficial, NuttX nu este garantat că funcționează pe revizii vechi ale chip-ului ESP32, și, din păcate, RTOS-ul va bloca rularea cu un PANIC, după cum puteți vedea în codul sursă de aici.

Observăm că putem defini simbolul ESP32_IGNORE_CHIP_REVISION_CHECK pentru a trece peste această verificare, pe care îl putem insera prin variabla EXTRAFLAGS ca în exemplul de mai sus. Din păcate, acest workaround va trebui MEREU activat la compilare… așadar, nu-l uitați!

Î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:

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:

În final, ar trebui să obțineți și un log de boot asemănător cu cel din screenshot-ul atașat:

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

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

2. Asemănător exercițiului anterior, compilați și încărcați aplicația “rgbled”.

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.

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

3. Bonus - faceți led-ul să clipească o dată pe secundă in roșu, verde, albastru.

Resurse

si/laboratoare/01.txt · Last modified: 2024/09/24 19:49 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