This shows you the differences between two versions of the page.
|
si:laboratoare:2026:01 [2026/09/28 18:10] dan.tudose created |
si:laboratoare:2026:01 [2026/09/28 18:31] (current) dan.tudose [4. Alegerea unei plăci țintă Zephyr pentru Hacktor] |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== Zephyr RTOS: Intro, Building a simple app ====== | + | ====== Lab 01: Zephyr RTOS, compilarea unei aplicații simple ====== |
| - | Zephyr OS is a small, open-source real-time operating system (RTOS) designed for resource-constrained embedded and IoT devices, from tiny microcontrollers up to more capable edge hardware. It focuses on predictable, low-latency behavior with a preemptive kernel, strong configurability (you build only what you need), and broad hardware support through a clean device-driver model. Zephyr includes common embedded features like threads, synchronization primitives, timers, power management, networking stacks (e.g., TCP/IP, Bluetooth LE), and security options, all maintained under the Linux Foundation with an emphasis on portability, modularity, and production use. | + | Bine ați venit în laboratorul de **Sisteme Încorporate**! |
| + | |||
| + | În cadrul acestui laborator, ne propunem să vă familiarizăm cu sisteme de operare **RTOS (Real-Time Operating System)** - în speță **Zephyr OS** - care se pretează mai degrabă microcontrolerelor decât sistemelor de tip desktop. | ||
| + | |||
| + | Zephyr OS este un sistem de operare în timp real (RTOS), de dimensiuni reduse și cu sursă deschisă, conceput pentru dispozitive embedded și IoT cu resurse limitate, de la microcontrolere foarte mici până la platforme hardware edge mai performante. Acesta pune accentul pe un comportament predictibil, cu latență redusă, printr-un nucleu preemptiv, posibilități extinse de configurare (compilezi doar ceea ce îți trebuie) și suport pentru o gamă largă de platforme hardware, printr-un model bine structurat de drivere pentru dispozitive. Zephyr include funcționalități uzuale în sistemele embedded, precum fire de execuție, primitive de sincronizare, temporizatoare, gestionarea consumului de energie, stive de protocoale de comunicație (de exemplu, TCP/IP și Bluetooth LE) și opțiuni de securitate. Toate acestea sunt dezvoltate și întreținute sub egida Linux Foundation, cu accent pe portabilitate, modularitate și utilizarea în produse finale. | ||
| {{ :iothings:laboratoare:2025:zephyr_rtos_logo.png?300|}} | {{ :iothings:laboratoare:2025:zephyr_rtos_logo.png?300|}} | ||
| - | This tutorial walks you through: | + | Acest tutorial te ghidează prin următorii pași: |
| + | |||
| + | - configurarea unui mediu de dezvoltare Zephyr nou („de la zero”) pe un calculator | ||
| + | - compilarea exemplului ''hello_world'' din Zephyr pentru o platformă țintă **ESP32‑S3** | ||
| + | - scrierea aplicației în memoria flash a ceasului **Hacktor Watch** | ||
| + | - vizualizarea mesajului „Hello World” prin conexiunea **USB** | ||
| + | |||
| + | ===== 1. Hacktor Watch ===== | ||
| + | |||
| + | În acest laborator veți învăța cum să compilați și să încărcați sistemul de operare Zephyr OS pe smartwatch-ul **[[https://github.com/hacktorwatch/Hacktor-Watch-2.0 | Hacktor Watch]]**, dezvoltat în facultate și bazat pe un microprocesor **ESP32 S3** la care au fost adăugate: | ||
| + | * două butoane externe | ||
| + | * un display cu touch | ||
| + | * un senzor de haptics | ||
| + | * un accelerometru și giroscop | ||
| + | |||
| + | Mai jos puteți vedea diagrama hardware a ceasului: | ||
| + | |||
| + | {{ :si:iot2025:hacktor_watch_2.0.jpg?600 }} | ||
| + | |||
| + | Pentru a putea fi folosit pe microcontrolere, Zephyr are un **memory-footprint foarte scăzut** (de ordinul câtorva sute de kilobytes). Un alt feature care îl face potrivit sistemelor low-end este faptul că **nu folosește mecanismele de memorie virtuală** (mai costisitoare atât din punct de vedere hardware, cât și software) în mod implicit, acest mod de operare numindu-se **flat-mode addressing**. | ||
| - | - setting up a fresh Zephyr development environment (“from scratch”) on a computer | ||
| - | - building Zephyr’s ''hello_world'' sample for an **ESP32‑S3** target | ||
| - | - flashing it onto the **Hacktor** watch | ||
| - | - seeing the “Hello World” log over the **USB** connection | ||
| - | ===== 1. Install Zephyr “from scratch” on your computer ===== | + | ===== 2. Instalarea Zephyr „de la zero” pe calculator ===== |
| - | Zephyr’s official **Getting Started Guide** is the source of truth for host setup (Ubuntu/macOS/Windows), Python environment, west, and SDK installation. | + | **Ghidul introductiv oficial** al Zephyr reprezintă referința principală pentru configurarea calculatorului de dezvoltare (Ubuntu/macOS/Windows), a mediului Python și pentru instalarea west și a SDK-ului. |
| - | Reference: https://docs.zephyrproject.org/latest/develop/getting_started/index.html | + | Referință: https://docs.zephyrproject.org/latest/develop/getting_started/index.html |
| - | Below is a practical “do this in order” setup that follows that guide. | + | Mai jos este prezentată o procedură practică de configurare, cu pași de urmat în ordine, conform acestui ghid. |
| - | ==== 1.1 Install OS dependencies ==== | + | ==== 2.1 Instalarea dependențelor sistemului de operare ==== |
| - | Follow the **Install dependencies** step for your OS in Zephyr’s Getting Started Guide (Ubuntu/macOS/Windows). | + | Urmează pasul **Instalarea dependențelor** din ghidul introductiv Zephyr, corespunzător sistemului tău de operare (Ubuntu/macOS/Windows). |
| - | Guide: https://docs.zephyrproject.org/latest/develop/getting_started/index.html | + | Ghid: https://docs.zephyrproject.org/latest/develop/getting_started/index.html |
| - | Typical things you’ll need include: Python 3, CMake, Ninja, Git, and system build tools. | + | În mod obișnuit, vei avea nevoie de: Python 3, CMake, Ninja, Git și instrumentele de compilare ale sistemului. |
| - | ==== 1.2 Create a Zephyr workspace and Python virtual environment ==== | + | ==== 2.2 Crearea unui spațiu de lucru Zephyr și a unui mediu virtual Python ==== |
| - | Pick a workspace folder. In this tutorial I’ll use ''~/zephyrproject'' on Linux/macOS. | + | Alege un director pentru spațiul de lucru. În acest tutorial voi folosi ''~/zephyrproject'' pe Linux/macOS. |
| - | (Windows users can use something like ''C:\zephyrproject''.) | + | (Utilizatorii Windows pot folosi, de exemplu, ''C:\zephyrproject''.) |
| <code bash> | <code bash> | ||
| Line 42: | Line 61: | ||
| </code> | </code> | ||
| - | On Windows PowerShell (example): | + | În Windows PowerShell (exemplu): |
| <code powershell> | <code powershell> | ||
| Line 53: | Line 72: | ||
| - | ==== 1.3 Install west ==== | + | ==== 2.3 Instalarea west ==== |
| - | Zephyr’s official west install guide: | + | Ghidul oficial Zephyr pentru instalarea west: |
| https://docs.zephyrproject.org/latest/develop/west/install.html | https://docs.zephyrproject.org/latest/develop/west/install.html | ||
| Line 62: | Line 81: | ||
| </code> | </code> | ||
| - | ==== 1.4 Initialize and update the Zephyr workspace ==== | + | ==== 2.4 Inițializarea și actualizarea spațiului de lucru Zephyr ==== |
| <code bash> | <code bash> | ||
| Line 70: | Line 89: | ||
| </code> | </code> | ||
| - | Export Zephyr’s CMake package (so CMake can find Zephyr): | + | Exportă pachetul CMake al Zephyr (pentru ca CMake să poată găsi Zephyr): |
| <code bash> | <code bash> | ||
| Line 76: | Line 95: | ||
| </code> | </code> | ||
| - | Install Python requirements for Zephyr and its modules: | + | Instalează dependențele Python pentru Zephyr și modulele sale: |
| <code bash> | <code bash> | ||
| Line 82: | Line 101: | ||
| </code> | </code> | ||
| - | (That exact command appears in the Getting Started flow and is commonly the next step after ''west update''.) | + | (Această comandă apare exact în această formă în procedura din ghidul introductiv și reprezintă, de obicei, pasul următor după ''west update''.) |
| - | ==== 1.5 Install the Zephyr SDK (toolchain) ==== | + | ==== 2.5 Instalarea Zephyr SDK (setul de instrumente de compilare) ==== |
| - | Zephyr SDK documentation: | + | Documentația Zephyr SDK: |
| https://docs.zephyrproject.org/latest/develop/toolchains/zephyr_sdk.html | https://docs.zephyrproject.org/latest/develop/toolchains/zephyr_sdk.html | ||
| - | Install the Zephyr SDK for your OS, then ensure your environment can find it (either via the SDK setup script registering it, or via environment variables like ''ZEPHYR_SDK_INSTALL_DIR'' / ''ZEPHYR_TOOLCHAIN_VARIANT=zephyr''). | + | Instalează Zephyr SDK pentru sistemul tău de operare, apoi asigură-te că mediul de dezvoltare îl poate găsi (fie prin înregistrarea acestuia de către scriptul de configurare al SDK-ului, fie prin variabile de mediu precum ''ZEPHYR_SDK_INSTALL_DIR'' / ''ZEPHYR_TOOLCHAIN_VARIANT=zephyr''). |
| - | **Note:** ESP32‑S3 is **Xtensa** based, so you’ll need the Xtensa toolchain that’s included with the Zephyr SDK. | + | **Notă:** ESP32‑S3 se bazează pe arhitectura **Xtensa**, așa că vei avea nevoie de setul de instrumente de compilare pentru Xtensa inclus în Zephyr SDK. |
| - | ===== 2. ESP32 (Espressif) prerequisites inside Zephyr ===== | + | ===== 3. Cerințe preliminare pentru ESP32 (Espressif) în Zephyr ===== |
| - | ==== 2.1 Fetch Espressif RF binary blobs ==== | + | ==== 3.1 Descărcarea componentelor binare Espressif pentru RF ==== |
| - | Zephyr’s Espressif HAL requires binary blobs (RF calibration, etc.). Zephyr board docs for Espressif boards call this out and recommend fetching after ''west update''. | + | Stratul de abstractizare hardware (HAL) Espressif din Zephyr necesită componente binare (pentru calibrarea RF etc.). Documentația Zephyr pentru plăcile Espressif menționează acest lucru și recomandă descărcarea lor după ''west update''. |
| - | Example (ESP32 DevKitC doc): it explicitly instructs ''west blobs fetch hal_espressif''. | + | Exemplu (documentația ESP32 DevKitC): se indică explicit executarea comenzii ''west blobs fetch hal_espressif''. |
| - | Run: | + | Rulează: |
| <code bash> | <code bash> | ||
| Line 108: | Line 127: | ||
| </code> | </code> | ||
| - | If you skip this, you may see build or runtime failures for ESP32 targets. | + | Dacă omiți acest pas, pot apărea erori de compilare sau de execuție pentru platformele țintă ESP32. |
| - | ===== 3. Pick a Zephyr “board target” for Hacktor ===== | + | ===== 4. Alegerea unei plăci țintă Zephyr pentru Hacktor ===== |
| - | Hacktor is **not** (yet) an upstream Zephyr board (maybe you could help with that?), so we need a compatible Zephyr board definition to build/flash a first image. | + | Hacktor **nu** se află (încă) printre plăcile incluse în proiectul principal Zephyr (poate ai putea contribui la acest lucru?), așa că avem nevoie de o definiție de placă Zephyr compatibilă pentru a compila și a scrie în memoria flash o primă imagine a aplicației. |
| - | You have two reasonable approaches: | + | Există două abordări rezonabile: |
| - | - **A. Quick path (recommended for Hello World):** use an upstream ESP32‑S3 board definition that is already **4 MB flash** and uses **USB‑C** programming. | + | - **A. Varianta rapidă (recomandată pentru Hello World):** folosește o definiție de placă ESP32‑S3 din proiectul principal Zephyr, care are deja **4 MB de memorie flash** și permite programarea prin **USB‑C**. |
| - | - **B. Proper port:** create a custom “out‑of‑tree” Zephyr board for Hacktor (best long‑term, required once you use GPIOs/peripherals and want correct pin mapping). | + | - **B. Portare completă:** creează o definiție de placă Zephyr personalizată pentru Hacktor, în afara arborelui sursă Zephyr (cea mai bună variantă pe termen lung, necesară atunci când începi să folosești GPIO-uri și periferice și ai nevoie de o mapare corectă a pinilor). |
| - | This tutorial focuses on **A** to get you a successful first boot quickly, and then outlines **B**. | + | Acest tutorial se concentrează pe **A**, pentru a obține rapid o primă pornire reușită, dar varianta mai serioasă pentru proiecte viitoare ar trebui să fie **B**. |
| - | ==== 3.1 Approach A: Use ''esp32s3_devkitc'' as a close match ==== | + | ==== 4.1 Abordarea A: Folosirea ''esp32s3_devkitc'' ca variantă apropiată ==== |
| - | Zephyr includes the **Official Espressif ESP32 S3 Devkitc** board, which is explicitly documented as an ESP32-S3-WROOM-1, 8 MB Quad flash and 8MB Octal PSRAM. | + | Zephyr include placa **oficială Espressif ESP32 S3 Devkitc**, descrisă explicit în documentație ca fiind bazată pe ESP32-S3-WROOM-1, cu 8 MB de memorie flash Quad și 8 MB de PSRAM Octal. |
| - | Board doc: https://docs.zephyrproject.org/latest/boards/espressif/esp32s3_devkitc/doc/index.html | + | Documentația plăcii: https://docs.zephyrproject.org/latest/boards/espressif/esp32s3_devkitc/doc/index.html |
| - | Limitations: | + | Limitări: |
| - | * Pin mapping (LED, I2C, etc.) won’t match Hacktor. | + | * Maparea pinilor (LED, I2C etc.) nu va corespunde celei de pe Hacktor. |
| - | * For hello_world, pin mapping doesn’t matter. | + | * Pentru hello_world, maparea pinilor nu contează. |
| - | ===== 4. Build “Hello World” for Hacktor and route console over USB ===== | + | ===== 5. Compilarea aplicației „Hello World” pentru Hacktor și redirecționarea consolei prin USB ===== |
| - | This section is where the Hacktor‑specific “special care” matters: | + | În această secțiune trebuie acordată atenție unor aspecte specifice Hacktor: |
| - | * **ensure 8 MB flash** | + | * **asigură-te că memoria flash este configurată la 8 MB** |
| - | * **ensure console output goes over the USB Serial/JTAG port** (not UART0) | + | * **asigură-te că ieșirea consolei este transmisă prin portul USB Serial/JTAG** (nu prin UART0) |
| - | We will: | + | Vom: |
| - | 1. create a small application folder | + | 1. crea un director pentru o aplicație simplă |
| - | 2. add a devicetree overlay that selects the USB serial device for console | + | 2. adăuga un fișier overlay devicetree care selectează dispozitivul serial USB pentru consolă |
| - | 3. build and flash | + | 3. compila aplicația și o vom scrie în memoria flash |
| - | ==== 4.1 Create a tiny application directory ==== | + | ==== 5.1 Crearea directorului pentru o aplicație minimală ==== |
| - | From your Zephyr workspace root: | + | Din directorul rădăcină al spațiului de lucru Zephyr: |
| <code bash> | <code bash> | ||
| Line 156: | Line 175: | ||
| </code> | </code> | ||
| - | Create these files: | + | Creează următoarele fișiere: |
| * ''CMakeLists.txt'' | * ''CMakeLists.txt'' | ||
| * ''prj.conf'' | * ''prj.conf'' | ||
| * ''src/main.c'' | * ''src/main.c'' | ||
| - | * a board overlay file | + | * un fișier overlay pentru placă |
| - | You can copy the sample hello_world, but I recommend creating a tiny app so you fully control the console configuration. | + | Poți copia exemplul hello_world, dar recomand crearea unei aplicații minimale, pentru a avea control deplin asupra configurației consolei. |
| **CMakeLists.txt** | **CMakeLists.txt** | ||
| Line 193: | Line 212: | ||
| </code> | </code> | ||
| - | **prj.conf** (minimal logging/console) | + | **prj.conf** (configurație minimală pentru jurnalizare/consolă) |
| <code conf> | <code conf> | ||
| CONFIG_CONSOLE=y | CONFIG_CONSOLE=y | ||
| Line 203: | Line 222: | ||
| - | ==== 4.2 Devicetree overlay: force console to USB Serial/JTAG ==== | + | ==== 5.2 Overlay devicetree: forțarea utilizării USB Serial/JTAG pentru consolă ==== |
| - | On ESP32 chips with a USB Serial/JTAG device exposed to Zephyr as a UART, you can route the console by changing the devicetree ''chosen'' nodes. | + | Pe cipurile ESP32 care dispun de un dispozitiv USB Serial/JTAG expus în Zephyr ca UART, poți redirecționa consola modificând nodurile ''chosen'' din devicetree. |
| - | A Zephyr issue discussing USB serial output on ESP32 shows an overlay pattern like: | + | O discuție despre o problemă raportată în proiectul Zephyr, referitoare la ieșirea serială USB pe ESP32, prezintă următorul model de overlay: |
| - | * set ''zephyr,console'' to ''&usb_serial'' | + | * setează ''zephyr,console'' la ''&usb_serial'' |
| - | * enable the ''usb_serial'' node | + | * activează nodul ''usb_serial'' |
| - | (See Zephyr issue #60825 about using ''usb_serial'' for console on ESP32-class devices.) | + | (Consultă problema #60825 din proiectul Zephyr, despre utilizarea ''usb_serial'' pentru consolă pe dispozitive din familia ESP32.) |
| - | In the root of the project folder, create: | + | În rădăcina directorului proiectului, creează: |
| **app.overlay** | **app.overlay** | ||
| Line 229: | Line 248: | ||
| </code> | </code> | ||
| - | Why this matters for Hacktor: | + | De ce este important acest lucru pentru Hacktor: |
| - | * DevKit‑style ESP32 boards often default the console to **UART0** (meant for an external USB‑UART bridge). | + | * Plăcile ESP32 de tip DevKit folosesc adesea implicit **UART0** pentru consolă (destinat unei punți USB‑UART externe). |
| - | * Hacktor uses **USB Serial/JTAG over the USB connector**, so the console needs to be routed there. | + | * Hacktor folosește **USB Serial/JTAG prin conectorul USB**, așa că ieșirea consolei trebuie redirecționată acolo. |
| - | ==== 4.3 Build the application ==== | + | ==== 5.3 Compilarea aplicației ==== |
| - | Activate your Python venv first if it isn’t active: | + | Activează mai întâi mediul virtual Python, dacă nu este deja activ: |
| <code bash build.sh> | <code bash build.sh> | ||
| Line 244: | Line 263: | ||
| </code> | </code> | ||
| - | Then go to your ''hacktor_hello'' folder and create this build script, name it ''build.sh'': | + | Apoi accesează directorul ''hacktor_hello'' și creează următorul script de compilare, cu numele ''build.sh'': |
| <code bash> | <code bash> | ||
| Line 372: | Line 391: | ||
| - | ==== 4.4 Flash Hacktor over USB ==== | + | ==== 5.4 Scrierea aplicației pe Hacktor prin USB ==== |
| - | Connect Hacktor Watch over USB‑C. | + | Conectează ceasul Hacktor prin USB‑C. |
| - | Then build and flash by running: | + | Apoi compilează aplicația și scrie-o în memoria flash, rulând: |
| <code bash> | <code bash> | ||
| Line 382: | Line 401: | ||
| </code> | </code> | ||
| - | You will see the app being built, uploaded and then a serial terminal will print out the Hello World message. | + | Vei vedea cum aplicația este compilată și încărcată pe dispozitiv, după care un terminal serial va afișa mesajul Hello World. |
| - | + | ||