Как работает stm32-gdbpy-scenario
Один сценарий — один прогон — один проверяемый итог. Python внутри GDB доходит до функции, читает или временно меняет переменную, проверяет наблюдаемую реакцию прошивки и возвращает всё как было. Без фреймворка: нужны GDB с Python, GDB-сервер и Python на хосте. Для коротких действий GDB не нужен вовсе — стоп, старт, сброс и чтение адреса выполняются одной командой, в том числе на удалённом стенде по SSH.
Путь сценария
GDB с Python
принимается только GDB, выполнивший python print(6 * 7)
Отпечаток стенда
пробник, узел и DEV_ID совпадают с прошлыми прогонами
ocd.py state read 0xE0042000Бюджет
таймауты сервера и GDB, потолок итераций, ожидание по тикам цели
--timeout 60OpenOCD
ST-Link или J-Link (transport select swd), локально
J-Link GDB Server
сервер SEGGER, имя МК из базы SEGGER
--jlink-device AT32F403ACGU7Узел стенда
сервер на узле через nohup, SSH-туннель, после прогона — kill своего pid
Сценарий gdb-py
шаблон: check, reach, read, write, monitor, record
gdb -nx -batch app.elf -ex "source ..."Без платы
Renode поднимает GDB-сервер с моделью платы; тот же сценарий, итог помечается «emulator».
--renode-platform board.replfinally; записанное возвращается и проверяется чтением.run.json
проверки, наблюдения, окружение, время, последний шаг
status, checks, records, restoredPASS / FAIL / ERROR / TIMEOUT
0 — PASS, 1 — провал проверки, 2 — исключение, невозвращённая переменная или зависание
годится для CIРаботает дальше
OpenOCD: continue &, detach; J-Link: monitor go, disconnect
Порядок внутри сценария
monitor reset halt, иначе reach("main") зависнет.Команды без GDB
| Действие | OpenOCD | J-Link Commander |
|---|---|---|
read | mdw, ядро не останавливается | mem32, тоже на ходу |
halt | сохраняется после выхода | отпускается при выходе |
resume | в новом сеансе только после halt | g; для работающего ядра «already running» |
reset-halt | reset halt | r |
reset-run | reset run | r, g |
python scripts/ocd.py --ssh user@stand --target stm32f4x \
--serial <серийник> state read 0xE0042000
python scripts/jlink.py --ssh user@stand --device AT32F403ACGU7 \
--serial <номер> halt state resume
Чтение адреса одной строкой
ssh user@stand "openocd -f interface/stlink.cfg \ -c 'adapter serial <серийник>' -f target/stm32f4x.cfg \ -c init -c 'mdw 0xE0042000' -c shutdown 2>&1 | grep -i '^0x'" # 0xe0042000: 10006431
| Способ | Время |
|---|---|
| одноразовый сеанс, локально | 0,3 с |
| одноразовый сеанс по SSH | 0,7–1,9 с |
работающий OpenOCD, socat на узле | ~0,5 с |
туннель и Tcl-порт (ocd.py --tcl) | ~0,4 с; локально 0,1 с |
Что важно понимать
monitor flash breakpoints = 0 J-Link GDB Server ставит программные точки останова записью во Flash. Запускатель включает это сам.halt, сброс и запись Flash меняют работу платы. На силовой плате — только после проверки, что стенд тестовый.--adapter-usb-location 7-1.1.3.Насколько проверено
Проверено на стендах 28.10.2026
- BlackPill F411CE локально (Windows) и по SSH: команды, сценарий по адресам, копия Flash, прошивка зонда, сценарий зонда, возврат образа с совпавшим хешем
- F401CC и Blue Pill F103C8 по SSH: то же
- Nucleo F030R8 и F429ZI (ST-Link V2 по USB-адресу) по SSH: команды и сценарий по адресам
- AT32F403A за J-Link по SSH: JLinkExe и OpenOCD, сценарий через J-Link GDB Server и OpenOCD
CI и открытые вопросы
- CI: пример зонда в Renode и четыре исхода шаблона (PASS, FAIL, ERROR с возвратом, TIMEOUT)
- однократное нулевое чтение сразу после прошивки — причина не установлена, готовность проверяется переменной прошивки
- прошивка AT32 через OpenOCD не проверялась: драйвер Flash не опознал МК
Описание навыка (SKILL.md) и скрипты · версия 1.2.0