Differences

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

Link to this comparison view

si:laboratoare:01 [2023/09/30 10:51]
robert_ionut.alexa [Laboratoare]
si:laboratoare:01 [2024/09/24 19:49] (current)
florin.stancu [Compilarea și rularea]
Line 3: Line 3:
 Bine ați venit în laboratorul de Sisteme Embedded! 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.+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ăcuțele ​ESP32 Sparrow. Acestea (ESP32 Sparrowsunt construite pornind de la un modul de ESP32 Wrover la care au fost adăugate:+Î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 lumină - LTR308
   * un senzor de temperatură,​ umiditate și presiune - BME680   * un senzor de temperatură,​ umiditate și presiune - BME680
Line 11: Line 11:
   * un microfon prin I2S   * un microfon prin I2S
   * un cititor de carduri microSD   * 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 |}} {{ :​si:​laboratoare:​esp32_sparrow.jpg?​600 |}}
Line 18: Line 20:
 ==== Linux ==== ==== Linux ====
  
-Dacă rulați pe un sistem cu Linux nativ, continuați de la pasul [Compilarea și încărcarea pe plăcuță].+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 ==== ==== 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 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. 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.+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: Î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:
Line 41: Line 43:
 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]]. 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 ​si incarcarea ​pe placuta ​=====+===== Compilarea ​și încărcarea ​pe placă ​=====
  
 Pașii de mai jos trebuie urmați ca utilizator privilegiat (root): Pașii de mai jos trebuie urmați ca utilizator privilegiat (root):
Line 49: Line 51:
   * 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ă.   * 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   * compilarea în urma căreia va rezulta un binar
-  * încărcarea binarului pe plăcuță+  * î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]]. 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]].
Line 76: Line 78:
 <​code>​ <​code>​
 mkdir ~/​nuttxspace && cd ~/​nuttxspace mkdir ~/​nuttxspace && cd ~/​nuttxspace
-git clone https://​github.com/​apache/​incubator-nuttx.git nuttx +git clone --branch=nuttx-12.5.1 ​https://​github.com/​apache/​incubator-nuttx.git nuttx 
-git clone https://​github.com/​apache/​incubator-nuttx-apps.git apps+git clone --branch=nuttx-12.5.1 ​https://​github.com/​apache/​incubator-nuttx-apps.git apps
 </​code>​ </​code>​
  
Line 103: Line 105:
 cd ~/​nuttxspace/​nuttx cd ~/​nuttxspace/​nuttx
 ./​tools/​configure.sh -l esp32-sparrow-kit:​nsh ./​tools/​configure.sh -l esp32-sparrow-kit:​nsh
-make -j4+make EXTRAFLAGS="​-DESP32_IGNORE_CHIP_REVISION_CHECK" ​-j4
 esptool.py erase_flash esptool.py erase_flash
 make flash ESPTOOL_PORT=/​dev/​ttyUSB0 ESPTOOL_BAUD=115200 ESPTOOL_BINDIR=../​esp-bins make flash ESPTOOL_PORT=/​dev/​ttyUSB0 ESPTOOL_BAUD=115200 ESPTOOL_BINDIR=../​esp-bins
 </​code>​ </​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:+<note warning>​ 
 +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 [[https://​github.com/​apache/​nuttx/​blob/​c724ed51fbb36b3e65003e474a3b7517bb91e2e7/​arch/​xtensa/​src/​esp32/​esp32_start.c#​L235|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**! 
 +</​note>​ 
 + 
 +<​hidden>​Uneori,​ dacă se uită oricare din flaguri sau se configurează greșit proiectul (e.g., nu se pune argumentul cu tipul plăcii bun), compilarea NuttX va crăpa ​cu mesaje de eroare dubioase. Ca workaround de urgență (dacă nu merge un simplu ''​make distclean''​ și configure din nou), se recomandă ștergerea directoarelor ''​nuttx''​ și ''​apps''​ și re-descărcarea lor pentru a nu pierde timp cu depanarea în zadar... 
 +</​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 |}} {{ :​si:​laboratoare:​nuttx_download_mode.png |}}
  
-Pentru a vă conecta la placuță veți folosi ''​picocom /​dev/​ttyUSB0 -b 115200''​.+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''​. Î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.+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 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''​.+Î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: Dacă nu aveți erori, ar trebui să vă apară un log asemănător cu cel de mai jos:
Line 130: Line 141:
 ===== Exerciții ===== ===== 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ă.+**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> <note tip>
Line 140: Line 151:
  
 <note tip> <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: Dacă rulați pe plăcuțele verzi, trebuie să schimbați pinii LED-ului:
   * CONFIG_ESP32_LEDC_CHANNEL0_PIN=25   * CONFIG_ESP32_LEDC_CHANNEL0_PIN=25
si/laboratoare/01.1696060311.txt.gz · Last modified: 2023/09/30 10:51 by robert_ionut.alexa
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