Table of Contents

Laboratorul 01. NuttX - Configurare și instalare

Bine ați venit la școala de vară IoT Summer School!

In cadrul scolii de vara, ne propunem sa va familiarizam cu sisteme de operare RTOS (NuttX) care se preteaza mai degraba 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 smartwatch-ul Hector Watch, dezvoltat in facultate si bazat pe un modul ESP32 S3 mini la care au fost adaugate:

Mai jos puteti vedea si o poza cu PCB-ul ceasului:

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ă (mai costisitoare atat din punct de vedere hardware cat si software) î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:

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 urmariti tutorialul de aici.

Compilarea și încărcarea pe placă

Pașii de mai jos trebuie urmați ca utilizator privilegiat (root):

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 /* optional, realizeaza actualizarea intregului sistem */
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-esp32s3-elf-12.2.0_20230208-x86_64-linux-gnu.tar.xz
tar -xf xtensa-esp32s3-elf-12.2.0_20230208-x86_64-linux-gnu.tar.xz
mkdir /opt/xtensa
mv xtensa-esp32s3-elf/ /opt/xtensa/
echo "export PATH=\$PATH:/opt/xtensa/xtensa-esp32s3-elf/bin" >> ~/.bashrc
source ~/.bashrc

Descărcarea repository-urilor

git clone git@github.com:radupascale/hectorwatch-nuttx.git
cd hectorwatch-nuttx
git submodule init
git submodule update

NuttX folosește 2 directoare separate:

  • nuttx, care conține sistemul de operare: scheduler, drivere, sisteme de fișiere, etc.
  • nuttx-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.

Repository-ul hectorwatch-nuttx contine nuttx si apps ca submodule care trebuie initializate (descarcate) separat.

Pentru a putea rula NuttX, este nevoie sa incarcati bootloader-ul si tabela de partitii in memoria flash a ESP32-ului. Acestea pot fi compilate manual (daca aveti nevoie de modificari la bootloader, de exemplu), dar exista si binare precompilate pe care le puteti descarca de pe github:

wget https://github.com/espressif/esp-nuttx-bootloader/releases/download/latest/bootloader-esp32s3.bin
wget https://github.com/espressif/esp-nuttx-bootloader/releases/download/latest/partition-table-esp32s3.bin

Cu toate acestea, Hectorwatch-nuttx contine deja binarele precompilate in esp32s3-bins.

Compilarea și rularea

Pentru a configura si compila NuttX, folositi urmatoarea secventa de comenzi:

cd ~/hectorwatch-nuttx/nuttx
./tools/configure.sh -l hacktorwatch:usbnsh
make -j$(nproc)

În functie de tipul de placă pe care rulați, este posibil să fie nevoie să apăsați un buton 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. In cazul smartwatch-ului nostru, aveti mai jos o poza atasata care va arata ce rol are fiecare buton:

Daca vrem sa incarcam NuttX pe un ESP32S3 (microcontroller-ul care sta la baza ceasului nostru), pentru a comuta din “Boot” in “Download” nu este suficient sa apasati un singur buton, ci trebuia sa urmati o secventa de operatii: Tineti apasat BOOTapasati RESET o singura dataridicati degetul de pe BOOT. Acum puteti sa flash-uiti microcontroller-ul folosind comanda make flash ESPTOOL_PORT=/dev/ttyACM0 ESPTOOL_BAUD=115200 ESPTOOL_BINDIR=../esp32s3-bins.

Dupa ce ati terminat procesul de flash, este nevoie de inca un reset pentru a comuta inapoi din modul de “Download” in cel de “Boot”.

Pentru a vă conecta la placă veți folosi picocom /dev/ttyACM0 -b 115200.

Pentru macOS, folositi urmatoarele comenzi:

./tools/configure.sh -m hacktorwatch:usbnsh
make -j$(sysctl -n hw.ncpu)
make flash ESPTOOL_PORT=/dev/cu.usbmodem101 ESPTOOL_BAUD=115200 ESPTOOL_BINDIR=../esp32s3-bins
sudo picocom -b 115200 /dev/cu.usbmodem01

Observati flag-ul ”-m” si denumirea diferita a portului usb.

Î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ă nu aveți erori, ar trebui să vă apară un log asemănător cu cel de mai jos:

În final, odata ce va conectati la ceas, ar trebui sa obtineti un log precum cel de mai jos:

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.

Resurse