Сборка для микроконтроллера
Теперь поговорим о встраиваемых системах. Когда дело доходит до компиляции Rust-кода для микроконтроллера, всё работает немного иначе, чем в обычных настольных системах. Микроконтроллеры обычно не запускают полноценную операционную систему вроде Linux или Windows. Вместо этого они работают в минимальной среде, часто вообще без ОС. Это называется bare-metal, то есть «голое железо».
Rust поддерживает такой режим через no_std. В обычных программах на Rust стандартная библиотека (std) отвечает за файловые системы, потоки, выделение памяти в куче и ввод-вывод, но ничего из этого нет на bare-metal микроконтроллере. Поэтому вместо std мы используем гораздо меньшую библиотеку core, которая предоставляет только самые необходимые строительные блоки.
Целевая платформа (target triple) для Pico 2
Raspberry Pi Pico 2 (чип RP2350), как вы уже знаете, особенный: он содержит выбираемые ядра ARM Cortex-M33 и RISC-V Hazard3. Вы можете выбрать, какую архитектуру процессора использовать.
Цель для ARM Cortex-M33
Для режима ARM нужно использовать цель thumbv8m.main-none-eabi:
Разберём её:
- Архитектура (thumbv8m.main): Cortex-M33 использует набор инструкций ARM Thumb-2 для архитектуры ARMv8-M.
- Поставщик (none): конкретный поставщик не указан.
- ОС (none): операционной системы нет, это bare-metal.
- ABI (eabi): Embedded Application Binary Interface, стандартное соглашение о вызовах для встраиваемых систем ARM.
Чтобы установить и использовать эту цель:
rustup target add thumbv8m.main-none-eabi
cargo build --target thumbv8m.main-none-eabi
Цель для RISC-V Hazard3
Для режима RISC-V используйте цель riscv32imac-unknown-none-elf:
riscv32imac-unknown-none-elf
Разберём её:
- Архитектура (riscv32imac): 32-битный RISC-V с наборами инструкций I (целочисленные), M (умножение и деление), A (атомарные) и C (сжатые).
- Поставщик (unknown): конкретный поставщик не указан.
- ОС (none): операционной системы нет, это bare-metal.
- Формат (elf): ELF (Executable and Linkable Format), формат объектных файлов, который часто используется во встраиваемых системах.
Чтобы установить и использовать эту цель:
rustup target add riscv32imac-unknown-none-elf
cargo build --target riscv32imac-unknown-none-elf
В наших упражнениях мы в основном будем использовать режим ARM. Некоторые крейты, например panic-probe, не работают в режиме RISC-V.
Конфигурация Cargo
В быстром старте вы могли заметить, что мы ни разу вручную не передавали флаг --target при запуске команд cargo. Откуда же cargo знал, для какой цели собирать? Потому что цель уже была задана в файле .cargo/config.toml.
Этот файл позволяет хранить настройки, относящиеся к cargo, включая цель сборки по умолчанию. Чтобы настроить его для Pico 2 в режиме ARM, создайте папку .cargo в корне проекта и добавьте файл config.toml со следующим содержимым:
[build]
target = "thumbv8m.main-none-eabihf"
Теперь не нужно передавать --target каждый раз. Cargo будет использовать эту цель автоматически.