14.1.1.2. Budowanie oprogramowania układowego¶
Mając przygotowane środowisko z Konfiguracja środowiska programistycznego, zbudowanie obrazu oprogramowania układowego sprowadza się do dwóch poleceń make plus wyboru TARGET.
14.1.1.2.1. Kompilacja¶
Najpierw zbuduj mpy-cross, narzędzie hosta kompilujące zamrożone moduły .py do kodu bajtowego (zrób to raz, a następnie ponownie zawsze, gdy aktualizujesz MicroPython):
make -j$(nproc) -C lib/micropython/mpy-cross
Następnie zbuduj oprogramowanie układowe dla płytki, gdzie <TARGET> jest jedną z nazw z poniższej tabeli:
make -j$(nproc) TARGET=<TARGET>
-j$(nproc) buduje równolegle na wszystkich rdzeniach procesora (na macOS użyj -j$(sysctl -n hw.ncpu)). TARGET jest obowiązkowy – make bez celu przerywa działanie komunikatem „Invalid or no TARGET specified”.
Pełna pierwsza kompilacja, od początku do końca:
make sdk
make -j$(nproc) -C lib/micropython/mpy-cross
make -j$(nproc) TARGET=OPENMV4
14.1.1.2.1.1. Obsługiwane płytki¶
Wartości TARGET to nazwy katalogów w boards/. Kamery i ich układy scalone:
Kamera |
|
MCU |
Port |
Rdzeń |
|---|---|---|---|---|
OpenMV Cam M4 |
|
STM32F427 |
stm32 |
Cortex-M4 |
OpenMV Cam M7 |
|
STM32F765 |
stm32 |
Cortex-M7 |
OpenMV Cam H7 |
|
STM32H743 |
stm32 |
Cortex-M7 |
OpenMV Cam H7 Plus |
|
STM32H743 + SDRAM |
stm32 |
Cortex-M7 |
OpenMV Pure Thermal |
|
STM32H743 + SDRAM |
stm32 |
Cortex-M7 |
OpenMV Cam N6 |
|
STM32N657 |
stm32 |
Cortex-M55 |
OpenMV Cam RT1062 |
|
MIMXRT1062 |
mimxrt |
Cortex-M7 |
OpenMV AE3 |
|
Alif Ensemble (podwójny M55) |
alif |
Cortex-M55 |
Arduino Portenta H7 |
|
STM32H747 |
stm32 |
Cortex-M7 |
Arduino Giga |
|
STM32H747 |
stm32 |
Cortex-M7 |
Arduino Nicla Vision |
|
STM32H747 |
stm32 |
Cortex-M7 |
Arduino Nano 33 BLE Sense |
|
nRF52840 |
nrf |
Cortex-M4 |
Arduino Nano RP2040 Connect |
|
RP2040 |
rp2 |
Cortex-M0+ |
Zbuduj dokładnie ten TARGET, który odpowiada Twojemu sprzętowi – np. OPENMV4 dla OpenMV Cam H7, OPENMV4P dla H7 Plus, OPENMV_N6 dla N6.
14.1.1.2.1.2. Wynik kompilacji¶
Wszystko dla danej płytki trafia do build/<TARGET>/bin/. Dla TARGET=OPENMV4 jest to build/OPENMV4/bin/, zawierający:
Plik |
Co to jest |
|---|---|
|
Plik binarny oprogramowania układowego – wgrywany przez OpenMV IDE Tools -> Load Custom Firmware oraz przez |
|
Oprogramowanie układowe z symbolami debugowania – plik, który wskazujesz debuggerowi |
|
Bootloader (tylko na płytkach z włączonym bootloaderem) |
|
Połączony obraz bootloader + oprogramowanie układowe |
|
Obraz systemu plików tylko do odczytu ROM wgrywany obok oprogramowania układowego |
Alif AE3 jest dwurdzeniowy, więc produkuje firmware_M55_HP.elf / firmware_M55_HP.bin (rdzeń o wysokiej wydajności) oraz osobno firmware_M55_HE.elf / firmware_M55_HE.bin (rdzeń o wysokiej efektywności), a także obraz spisu treści (TOC), który informuje boot ROM, gdzie znajduje się obraz każdego rdzenia.
14.1.1.2.1.3. Czyszczenie i ponowne budowanie¶
Kompilacje są izolowane dla każdej płytki w build/<TARGET>/. Aby wyczyścić kompilację jednej płytki:
make TARGET=<TARGET> clean
Nie ma celu distclean; clean zawsze wymaga TARGET. mpy-cross jest współdzielony między płytkami – jeśli aktualizujesz MicroPython, przebuduj go również:
make -C lib/micropython/mpy-cross clean
make -j$(nproc) -C lib/micropython/mpy-cross
Aby zaraportować zużycie pamięci flash/RAM przez kompilację:
make TARGET=<TARGET> size
14.1.1.2.1.4. Budowanie w Dockerze (bez łańcucha narzędzi na hoście)¶
Jeśli wolisz niczego nie instalować na hoście (lub jesteś na platformie bez natywnej kompilacji), skorzystaj ze ścieżki Dockera:
git clone --recursive https://github.com/openmv/openmv.git
cd openmv/docker
make TARGET=<TARGET>
Artefakty pojawiają się w openmv/docker/build/<TARGET>. Dla powtarzanych kompilacji istnieje przyrostowa ścieżka deweloperska, która montuje repozytorium pod tą samą bezwzględną ścieżką wewnątrz kontenera, co na hoście, dzięki czemu ścieżki źródłowe debuggera rozwiązują się bez remapowania:
make install-sdk
make build-firmware-dev TARGET=<TARGET>
Uruchom make clean-dev przy przełączaniu TARGET.
14.1.1.2.2. Opcje kompilacji¶
Zachowanie kompilacji sterowane jest zmiennymi przekazywanymi w wierszu poleceń make, na przykład:
make -j$(nproc) TARGET=OPENMV4 DEBUG=1 V=1
Zmienne, których użyje deweloper oprogramowania układowego:
Zmienna |
Domyślnie |
Efekt |
|---|---|---|
|
(wymagane) |
Płytka do zbudowania. Wybiera |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Którego debuggera używają cele |
Informacja
Istnieje wiele innych zmiennych (sterowniki kamer/sensorów, stosy bezprzewodowe, backendy ML, stos USB, bezpieczny rozruch itd.), ale są one ustawiane per płytka w boards/<TARGET>/board_config.mk i normalnie nie nadpisuje się ich w wierszu poleceń. Ich zmiana to dostosowywanie płytki, a nie normalna kompilacja deweloperska – zobacz docs/boards.md w repozytorium oprogramowania układowego.
W codziennej pracy jedyne opcje, których potrzebujesz, to TARGET (zawsze), DEBUG=1 (gdy zamierzasz debugować, zobacz Debugowanie oprogramowania układowego) oraz sporadycznie V=1.