Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Сборка для микроконтроллера

Теперь поговорим о встраиваемых системах. Когда дело доходит до компиляции 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 будет использовать эту цель автоматически.