14.1.1.2. بناء البرنامج الثابت¶
بوجود البيئة من إعداد بيئة التطوير في مكانها، يكون بناء صورة برنامج ثابت أمرَي make بالإضافة إلى اختيار TARGET.
14.1.1.2.1. التصريف¶
أولًا ابنِ mpy-cross، أداة المضيف التي تصرّف وحدات .py المُجمّدة إلى شيفرة بايت (افعل هذا مرةً واحدةً، ومجددًا كلما حدّثت MicroPython):
make -j$(nproc) -C lib/micropython/mpy-cross
ثم ابنِ البرنامج الثابت للوحة، حيث يكون <TARGET> أحد الأسماء من الجدول أدناه:
make -j$(nproc) TARGET=<TARGET>
تبني -j$(nproc) على التوازي عبر كل أنوية المعالج (على macOS استخدم -j$(sysctl -n hw.ncpu)). والـ TARGET إلزامي -- إذ يُجهَض make بلا هدف مع الرسالة "Invalid or no TARGET specified".
بناء أول كامل، من البداية إلى النهاية:
make sdk
make -j$(nproc) -C lib/micropython/mpy-cross
make -j$(nproc) TARGET=OPENMV4
14.1.1.2.1.1. اللوحات المدعومة¶
قيم TARGET هي أسماء المجلدات تحت boards/. والكاميرات ورقائقها:
الكاميرا |
|
MCU |
المنفذ |
النواة |
|---|---|---|---|---|
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 (dual 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+ |
ابنِ TARGET المضبوط لعتادك بالضبط -- مثلًا OPENMV4 لـ OpenMV Cam H7، و OPENMV4P لـ H7 Plus، و OPENMV_N6 لـ N6.
14.1.1.2.1.2. خرج البناء¶
كل ما يخص لوحةً يستقر في build/<TARGET>/bin/. وبالنسبة لـ TARGET=OPENMV4 يكون ذلك build/OPENMV4/bin/، ويحتوي على:
الملف |
ما هو |
|---|---|
|
ثنائي البرنامج الثابت -- يُومَض بواسطة OpenMV IDE عبر Tools -> Load Custom Firmware وبواسطة |
|
البرنامج الثابت مع رموز التنقيح -- الملف الذي توجّه المنقّح إليه |
|
محمّل الإقلاع (فقط على اللوحات التي يكون فيها محمّل الإقلاع مُفعّلًا) |
|
صورة مدمجة لمحمّل الإقلاع + البرنامج الثابت |
|
صورة نظام ملفات ROM للقراءة فقط تُومَض إلى جانب البرنامج الثابت |
إن Alif AE3 ثنائي النواة، لذا فهو يُنتج firmware_M55_HP.elf / firmware_M55_HP.bin (النواة عالية الأداء) و firmware_M55_HE.elf / firmware_M55_HE.bin منفصلة (النواة عالية الكفاءة) بالإضافة إلى صورة جدول محتويات (TOC) تُخبر ROM الإقلاع بمكان صورة كل نواة.
14.1.1.2.1.3. التنظيف وإعادة البناء¶
البناءات معزولة لكل لوحة تحت build/<TARGET>/. ولمحو بناء لوحة واحدة:
make TARGET=<TARGET> clean
لا يوجد distclean؛ إذ يحتاج clean دائمًا إلى TARGET. والـ mpy-cross مُشترك عبر اللوحات -- فإذا حدّثت MicroPython، أعِد بناءه أيضًا:
make -C lib/micropython/mpy-cross clean
make -j$(nproc) -C lib/micropython/mpy-cross
للإبلاغ عن استخدام البناء للذاكرة فلاش/RAM:
make TARGET=<TARGET> size
14.1.1.2.1.4. البناء في Docker (دون سلسلة أدوات على المضيف)¶
إن كنت تفضّل عدم تثبيت أي شيء على المضيف (أو كنت على منصة دون بناء أصلي)، استخدم مسار Docker:
git clone --recursive https://github.com/openmv/openmv.git
cd openmv/docker
make TARGET=<TARGET>
تظهر القطع الناتجة في openmv/docker/build/<TARGET>. وللبناءات المتكررة يوجد مسار تطوير تزايدي يضمّ المستودع عند المسار المطلق نفسه داخل الحاوية كما على المضيف، بحيث تتحلل مسارات مصدر المنقّح دون إعادة تخطيط:
make install-sdk
make build-firmware-dev TARGET=<TARGET>
شغّل make clean-dev عند تبديل TARGET.
14.1.1.2.2. خيارات البناء¶
يُتحكَّم في سلوك البناء عبر متغيرات تُمرَّر على سطر أمر make، على سبيل المثال:
make -j$(nproc) TARGET=OPENMV4 DEBUG=1 V=1
المتغيرات التي سيستخدمها مطور البرنامج الثابت:
المتغير |
الافتراضي |
الأثر |
|---|---|---|
|
(مطلوب) |
اللوحة المراد بناؤها. يختار |
|
|
يصرّف |
|
|
تطبع |
|
|
تُعرّف |
|
|
تبني |
|
|
تضيف |
|
|
أيُّ منقّح تستخدمه أهداف |
ملاحظة
توجد متغيرات كثيرة أخرى (مشغّلات الكاميرا/المستشعر، والمكدسات اللاسلكية، وخلفيات ML، ومكدس USB، والإقلاع الآمن، إلخ)، لكن تلك تُضبط لكل لوحة في boards/<TARGET>/board_config.mk ولا تُتجاوز عادةً على سطر الأمر. وتغييرها هو تخصيص للوحة، لا بناء مطوّر عادي -- انظر docs/boards.md في مستودع البرنامج الثابت.
للعمل اليومي، الخيارات الوحيدة التي تحتاجها هي TARGET (دائمًا)، و DEBUG=1 (كلما عزمت على التنقيح، انظر تصحيح أخطاء البرنامج الثابت)، و V=1 أحيانًا.