14.1.1.3. Симулятори#
Два значення TARGET збирають мікропрограму для запуску всередині симулятора на вашому хості, без підключеного обладнання. Вони існують для того, щоб мікропрограму можна було запускати та тестувати будь-де.
| Ядро | NPU | Симулятор |
|---|---|---|---|
| Cortex-M7 | None | QEMU |
| Cortex-M55 | Ethos-U55 (256 MACs) | Arm FVP – Corstone SSE-300 |
MPS2_AN500 – це базова ціль Cortex-M7 без NPU. Вона працює під QEMU, який швидко запускається та є легким способом перевірити платформо-незалежний код і набір тестів.
MPS3_AN547 – це Cortex-M55 з NPU Ethos-U55, що працює на Fast Models від Arm – FVP, який моделює еталонну підсистему Corstone SSE-300. Це ціль для перевірки NPU та шляху ML-моделі в симуляції.
Обидві надають файлову систему ROM та достатньо RAM (а M55 – ще й NPU), тому скрипти комп’ютерного зору та ML виконуються без змін.
Реального датчика немає, але модуль csi все одно працює з віртуальним – csi.CSI.snapshot() повертає синтетичний анімований тестовий шаблон (прокручувана шахівниця у відтінках сірого, градієнт у RGB565), а не живу сцену. Щоб обробити реальний вміст зображення, завантажте його з файлу: image.Image з фікстури у файловій системі ROM або потік image.ImageIO для записаних кадрів.
14.1.1.3.1. Збирання та запуск#
Кожен симулятор – це інструмент хоста, який ви встановлюєте самостійно. Ви збираєте ціль як будь-яку іншу (дивіться Збірка мікропрограми), а потім запускаєте її через run під відповідним симулятором – run збирає образ ROMFS, завантажує мікропрограму та залишає її працювати із серійним з’єднанням, до якого ви можете підключитися.
14.1.1.3.1.1. MPS2_AN500 (QEMU)#
QEMU постачається в більшості менеджерів пакетів як системний емулятор Arm:
Linux (Debian / Ubuntu) – встановіть його за допомогою
aptsudo apt install qemu-system-armmacOS – встановіть його за допомогою Homebrew:
brew install qemu
Потім зберіть та запустіть ціль:
make -j$(nproc) TARGET=MPS2_AN500
make TARGET=MPS2_AN500 run
14.1.1.3.1.2. MPS3_AN547 (Arm FVP)#
FVP – це Fixed Virtual Platform від Arm для Corstone SSE-300, що постачається у складі Arm Virtual Hardware. Вона доступна лише для Linux – на Mac використовуйте натомість ціль QEMU вище.
Завантажте набір, розпакуйте його та додайте його каталог bin/ до вашого PATH
wget https://artifacts.tools.arm.com/avh/11.31.28/avh-linux-x86_11.31_28_Linux64.tar.gz
mkdir -p ~/fvp
tar --strip-components=1 -xzf avh-linux-x86_11.31_28_Linux64.tar.gz -C ~/fvp
export PATH="$HOME/fvp/bin:$PATH"
FVP також потребує бібліотек Python з SDK у LD_LIBRARY_PATH під час запуску. Експортуйте його один раз на оболонку з кореня репозиторію – читання SDK_VERSION зберігає його коректним у міру оновлення закріпленого SDK репозиторієм:
export LD_LIBRARY_PATH="$HOME/openmv-sdk-$(cat SDK_VERSION)/python/lib:$LD_LIBRARY_PATH"
Потім зберіть та запустіть ціль:
make -j$(nproc) TARGET=MPS3_AN547
make TARGET=MPS3_AN547 run
14.1.1.3.2. Запуск набору тестів#
Модульні тести знаходяться у scripts/unittest/tests/, а їх фікстурні зображення та дані – у scripts/unittest/data/. Вони запускаються за допомогою mpremote, який монтує scripts/unittest/ на запущений симулятор та виконує його run.py.
Зв’язок із симулятором повільний зі стандартним mpremote, тому використовуйте копію, що постачається в репозиторії, із застосованим патчем серійного зв’язку (застосуйте його один раз):
patch -N -p1 -d lib/micropython < tools/mpremote-qemu-serial.patch
Для MPS2_AN500 під QEMU запустіть ціль – вона виводить псевдотермінал, на якому знаходиться її серійний порт (наприклад, /dev/pts/5):
make TARGET=MPS2_AN500 run
Потім, з іншої оболонки, спрямуйте пропатчений mpremote на цей пристрій:
python3 lib/micropython/tools/mpremote/mpremote.py connect /dev/pts/5 \
mount scripts/unittest/ run scripts/unittest/run.py
Для MPS3_AN547 під FVP серійний порт натомість є telnet-сокетом на порту 5555:
make TARGET=MPS3_AN547 run
python3 lib/micropython/tools/mpremote/mpremote.py connect socket://localhost:5555 \
mount scripts/unittest/ run scripts/unittest/run.py
run.py виявляє та виконує кожен тест, виводячи рядок PASSED / FAILED для кожного тесту з часом виконання та підсумком у кінці.
14.1.1.3.3. Додавання тесту#
Тести виявляються автоматично. Щоб додати тест, розмістіть у scripts/unittest/tests/ файл, що визначає функцію unittest(data_path, temp_path), яка повертає True, коли тест проходить, та False, коли він не проходить:
# scripts/unittest/tests/circles.py
def unittest(data_path, temp_path):
import image
img = image.Image(data_path + "/shapes.ppm", copy_to_fb=True)
circles = img.find_circles(threshold=5000, x_margin=30, y_margin=30, r_margin=30)
return len(circles) == 1 and circles[0][0:] == (118, 56, 22, 5856)
Аргументи data_path та temp_path вказують на дві файлові системи, які бачить симулятор під час виконання набору тестів:
Шлях | Забезпечується |
|---|---|
| Каталог хоста |
| Файлова система ROM плати, доступна лише для читання, вбудована в образ мікропрограми з |
Тож новий тест не потребує перезбирання, але нова фікстура потребує: образ ROM формується на основі romfs_config.json, а не окремих файлів даних, тому примусьте перезбирання, оновивши час файлу romfs_config.json плати (або make TARGET=<TARGET> clean) та запустивши знову.
Очікувані значення стверджуються безпосередньо в тесті, тому немає окремого файлу очікуваного виводу, який потрібно підтримувати. Щоб пропустити тест під час виконання – наприклад, коли йому потрібне обладнання, яке симулятор не моделює – викиньте виняток, повідомлення якого містить "SKIPPED".