Инструменты
Для работы с микроконтроллерами нужно несколько разных инструментов: мы будем работать с архитектурой, отличной от архитектуры вашего ноутбука, а запускать и отлаживать программы придётся на удалённом устройстве.
Мы будем использовать все перечисленные ниже инструменты. Если минимальная версия не указана, подойдёт любая свежая версия, но мы перечислили версии, которые тестировали.
- Rust 1.31, 1.31-beta или более новый тулчейн с поддержкой компиляции для ARM Cortex-M.
cargo-binutils~0.1.4qemu-system-arm. Протестированные версии: 3.0.0- OpenOCD >=0.8. Протестированные версии: v0.9.0 и v0.10.0
- GDB с поддержкой ARM. Настоятельно рекомендуется версия 7.12 или новее. Протестированные версии: 7.10, 7.11, 7.12 и 8.1
cargo-generateилиgit. Эти инструменты необязательны, но они облегчат работу с книгой.
Ниже объясняется, зачем нам нужны эти инструменты. Инструкции по установке приведены на следующей странице.
cargo-generate ИЛИ git
Bare-metal программы — это нестандартные программы на Rust (no_std), которые требуют некоторой настройки процесса компоновки, чтобы правильно задать раскладку памяти программы. Для этого нужны дополнительные файлы (например, скрипты компоновщика) и настройки (например, флаги компоновщика). Мы упаковали их в шаблон, чтобы вам нужно было заполнить только недостающую информацию (например, название проекта и характеристики целевого оборудования).
Наш шаблон совместим с cargo-generate — подкомандой Cargo для создания новых проектов Cargo из шаблонов. Также вы можете скачать шаблон с помощью git, curl, wget или веб-браузера.
cargo-binutils
cargo-binutils — это набор подкоманд Cargo, которые упрощают использование инструментов LLVM, поставляемых вместе с тулчейном Rust. Эти инструменты включают версии objdump, nm и size от LLVM и используются для анализа бинарных файлов.
Преимущество этих инструментов перед GNU binutils в том, что (а) установка инструментов LLVM выполняется одной и той же командой (rustup component add llvm-tools) независимо от вашей ОС и (б) такие инструменты, как objdump, поддерживают все архитектуры, которые поддерживает rustc, — от ARM до x86_64, так как все они используют один и тот же бэкенд LLVM.
qemu-system-arm
QEMU — это эмулятор. В данном случае мы используем вариант, который может полностью эмулировать системы ARM. Мы используем QEMU, чтобы запускать встраиваемые программы на хосте. Благодаря этому вы сможете пройти некоторые части этой книги, даже если у вас нет оборудования под рукой!
Инструменты для отладки встраиваемого Rust
Обзор
Отладка встраиваемых систем на Rust требует специализированных инструментов: программного обеспечения для управления процессом отладки, отладчиков для просмотра и контроля выполнения программы и аппаратных зондов, которые обеспечивают взаимодействие между хостом и встраиваемым устройством. В этом разделе описаны основные программные инструменты, такие как Probe-rs и OpenOCD, которые упрощают и поддерживают процесс отладки, а также популярные отладчики, такие как GDB и расширение Probe-rs для Visual Studio Code. Кроме того, рассмотрены ключевые аппаратные зонды — Rusty-probe, ST-Link, J-Link и MCU-Link, — которые необходимы для эффективной отладки и программирования встраиваемых устройств.
Программное обеспечение, управляющее инструментами отладки
Probe-rs
Probe-rs — современное программное обеспечение, ориентированное на Rust, которое предназначено для работы с отладчиками во встраиваемых системах. В отличие от OpenOCD, Probe-rs создан с прицелом на простоту и стремится уменьшить объём конфигурации, который часто требуется в других решениях для отладки. Он поддерживает различные зонды и целевые платформы и предоставляет высокоуровневый интерфейс для работы с встраиваемым оборудованием. Probe-rs интегрируется непосредственно с инструментами Rust, а через своё расширение — с Visual Studio Code, что позволяет разработчикам упростить процесс отладки.
OpenOCD (Open On-Chip Debugger)
OpenOCD — программный инструмент с открытым исходным кодом для отладки, тестирования и программирования встраиваемых систем. Он обеспечивает интерфейс между хост-системой и встраиваемым оборудованием и поддерживает различные транспортные уровни, например JTAG и SWD (Serial Wire Debug). OpenOCD работает вместе с GDB, который является отладчиком. OpenOCD широко поддерживается, имеет обширную документацию и большое сообщество, однако может требовать сложной конфигурации, особенно для нестандартных встраиваемых систем.
Отладчики
Отладчик позволяет разработчикам контролировать выполнение программы и просматривать его, чтобы находить и исправлять ошибки. Он предоставляет такие возможности, как установка точек останова, пошаговое выполнение кода построчно и просмотр значений переменных и состояния памяти. Отладчики необходимы для тщательной разработки и поддержки программного обеспечения: они помогают убедиться, что код ведёт себя так, как задумано, в различных условиях.
Отладчики умеют:
- работать с регистрами, отображёнными в память;
- устанавливать точки останова и точки наблюдения (breakpoints/watchpoints);
- читать и записывать регистры, отображённые в память;
- определять, что MCU остановлен из-за отладочного события;
- продолжать выполнение MCU после отладочного события;
- стирать и записывать флеш-память микроконтроллера.
Расширение Probe-rs для Visual Studio Code
У Probe-rs есть расширение для Visual Studio Code, которое обеспечивает удобную отладку без обширной настройки. Через это подключение разработчики могут использовать возможности, специфичные для Rust, например красивый вывод значений (pretty printing) и подробные сообщения об ошибках, так что процесс отладки соответствует экосистеме Rust.
TRACE32
TRACE32 — профессиональное решение для отладки и трассировки, разработанное компанией Lauterbach для встраиваемых систем. Оно поддерживает широкий спектр архитектур процессоров, включая ARM и RISC-V, и подключается к целевому оборудованию через JTAG, SWD и различные интерфейсы трассировки. TRACE32 предоставляет продвинутые возможности отладки, такие как отладка многоядерных систем, сложные точки останова и анализ трассировки в реальном времени. Он работает со стандартной отладочной информацией ELF/DWARF, поэтому совместим с бинарными файлами Rust, собранными обычными тулчейнами.
GDB (GNU Debugger)
GDB — универсальный отладчик, который позволяет разработчикам исследовать состояние программ во время их работы или после падения. Для встраиваемого Rust GDB подключается к целевой системе через OpenOCD или другие серверы отладки, чтобы взаимодействовать со встраиваемым кодом. GDB настраивается очень гибко и поддерживает такие возможности, как удалённая отладка, просмотр переменных и условные точки останова. Его можно использовать на разных платформах, и он имеет обширную поддержку специфичных для Rust задач отладки, например красивого вывода значений и интеграции с IDE.
Зонды
Аппаратный зонд — устройство, которое используется при разработке и отладке встраиваемых систем для обмена данными между компьютером-хостом и встраиваемым устройством. Обычно он поддерживает такие протоколы, как JTAG или SWD, что позволяет ему программировать, отлаживать и анализировать микроконтроллер или микропроцессор встраиваемой системы. Аппаратные зонды помогают разработчикам ставить точки останова, пошагово выполнять код и исследовать память и регистры процессора, что позволяет диагностировать и исправлять проблемы в реальном времени.
Rusty-probe
Rusty-probe — USB-зонд для аппаратной отладки с открытым исходным кодом, который предназначен для работы с probe-rs. Связка Rusty-probe и probe-rs представляет собой простое и недорогое решение для разработчиков встраиваемых приложений на Rust.
ST-Link
ST-Link — популярный зонд для отладки и программирования, разработанный STMicroelectronics в первую очередь для микроконтроллеров серий STM32 и STM8. Он поддерживает как отладку, так и программирование через интерфейсы JTAG или SWD (Serial Wire Debug). ST-Link широко используется благодаря прямой поддержке со стороны обширной линейки отладочных плат STMicroelectronics и интеграции в основные IDE, что делает его удобным выбором для разработчиков, работающих с микроконтроллерами STM.
J-Link
J-Link, разработанный компанией SEGGER Microcontroller, — надёжный и универсальный отладчик, который поддерживает широкий спектр процессорных ядер и устройств, не только ARM, но и RISC-V. Известный высокой производительностью и надёжностью, J-Link поддерживает различные интерфейсы связи, включая JTAG, SWD и JTAG с малым шагом выводов (fine-pitch JTAG). Его ценят за продвинутые возможности, например неограниченное количество точек останова во флеш-памяти, и за совместимость с большим количеством сред разработки.
MCU-Link
MCU-Link — отладочный зонд, который также работает как программатор; его выпускает NXP Semiconductors. Он поддерживает множество микроконтроллеров ARM Cortex и легко интегрируется с инструментами разработки, например с IDE MCUXpresso. MCU-Link особенно примечателен своей универсальностью и доступной ценой, что делает его удобным вариантом для любителей, преподавателей и профессиональных разработчиков.