Как работает stm32-renode-emulator

Прошивка запускается в эмуляторе вместо платы, печатает стартовый лог, а скрипт проверяет, что лог полный, правильный и принадлежит именно этой сборке. Так гипотезы проверяются до аппаратного опыта и в CI, не занимая стенд.

Путь данных

прошивка и ожидания прогон в эмуляторе отладка проверка и результат
1. Что подаётся на вход
Прошивка пишет лог через семихостинг: эмулятору не нужна модель UART.

прошивка.elf

лог через семихостинг, строки с префиксом времени

[ 0.001] boot: start
и

Секции ELF

версия, сборка и ревизия в .fw_version, контрольная сумма в .checksum

u8 major, minor, patch; u16 build
и

expected.toml

какие строки обязаны быть, каких быть не должно

[require].lines, [forbid].lines
2. Прогон: run.py выбирает эмулятор и машину
Каждая попытка пишет в новый каталог, прежние результаты не затираются.

run.py

находит эмулятор, проверяет версию, готовит макет

--profile G474 | F411, --platform
G474

Renode 1.17

макет Cortex-M4 с памятью и заглушками периферии или своя модель платы

stm32g4_mock.repl; 1.16.1 через renode_compat.py
или F411

QEMU

машина netduinoplus2 (STM32F405, тот же Cortex-M4); прошивка завершает прогон сама

SYS_EXIT
семихостинг

Каталог прогона

лог прошивки, журнал эмулятора, описание прогона

startup.log, emulator.log, run.json

Отладка вместо прогона

debug.resc поднимает GDB-сервер Renode и держит ядро до подключения, как ключ -S у QEMU.

arm-none-eabi-gdb firmware.elf -ex "target remote :3334"
3. Проверка лога
Запускается ключом --verify; итог — код возврата и отчёт.

check_startup_log.py

сверяет лог с ожиданиями и подставляет данные из ELF

{version}, {build}, {crc32}, {size}
пишет

Отчёт

какие правила выполнены, какие нет

startup-log-report.json
итог

Код возврата

0 — PASS (без --verify — CAPTURED), 1 — лог не прошёл проверку, 2 — ошибка прогона (нет эмулятора, лога, таймаут)

годится для CI

Что проверяется в логе

Полнотаmin_lines: оборванный лог не пройдёт.
Начало и конецfirst_line, last_line: регулярные выражения.
Обязательное[require].lines: каждое выражение должно найтись.
Запрещённое[forbid].lines: признаки отказа или чужой среды.
Эта сборкаВерсия, номер сборки и CRC из ELF должны совпасть с напечатанными.
ИсточникСтрока без префикса времени — ошибка: лог должен идти от журнала прошивки.

Маршруты

ПрофильЭмулятор и машинаВывод
G474Renode 1.17, макет stm32g4_mock.repl или модель своей платысемихостинг в файл
F411QEMU, netduinoplus2семихостинг в chardev-файл
python scripts/run.py --profile G474 --elf build/firmware.elf \
    --verify --expected boot.toml
python scripts/run.py --profile F411 --elf build/firmware.elf \
    --qemu qemu-system-arm

Версии Renode

  • 1.17 — основная. 1.16.1 работает с предупреждением, другие версии отклоняются.
  • В 1.17 семихостинг — отдельный обработчик CPU.SemihostingHandler, в 1.16.1 его UART висит на процессоре. Один макет обе версии не принимают, renode_compat.py готовит копию под найденную.
  • Тип ядра cortex-m4, а не cortex-m4f: в 1.16.1 второй отдаёт CPUID Cortex-M7. Сравнивайте номер ядра 0xC24, а не ревизию.

Что важно понимать

Эмулятор не платаВывод из прогона помечается «emulator». Аппаратные выводы из него не следуют.
Периферия — заглушкиЗапись сохраняется, флаги готовности сами не встают. Ожидание PLL или АЦП в эмуляторе зависнет.
Время виртуальноеДлительности и порядок прерываний не совпадают с железом.
Renode останавливается самЧерез одну виртуальную секунду. QEMU ждёт SYS_EXIT от прошивки или таймаут.
Адреса свереныАдреса заглушек макета G474 сверены с SVD STM32G474.
Не только STM32Подходит любой Cortex-M, для которого есть модель в Renode или машина в QEMU.

Насколько проверено

Проверяется в CI репозитория

  • прошивка-зонд для F411CE, F401CC и F103C8 в Renode 1.17 с проверкой лога
  • F411CE и F401CC в QEMU с выходом по времени
  • оборванный лог отклоняется
  • адреса макета G474 и модели зонда сверены с SVD
  • подготовка макета под 1.16.1 (renode_compat.py, без запуска самой 1.16.1)

Ещё не проверено

  • GDB-сервер Renode вне песочницы (R17)
  • соответствие эмулятора железу (R16)

Описание навыка (SKILL.md) и скрипты · версия 1.1.0