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

no_main

Когда вы попытаетесь собрать проект на этом этапе, то получите ошибку о том, что функция main требует стандартной библиотеки. Что?! (Я удержался от соблазна вставить сюда мем с Мистером Бином, потому что не всем такие мемы нравятся.) Что же делать? Где вообще начинается программа?

Во встраиваемых системах мы не используем обычный fn main, который опирается на стандартную библиотеку. Вместо этого нужно сообщить Rust, что точку входа мы предоставим сами. Для этого используется атрибут no_main.

Атрибут #![no_main] указывает, что программа не будет использовать стандартную точку входа (fn main).

В самом начале файла src/main.rs добавьте эту строку:

#![no_main]

Объявление точки входа

Теперь, когда мы отказались от стандартной точки входа, нужно указать Rust, с какой функции начинать. Крейт esp-hal предоставляет для этого удобный атрибут: #[main].

Этот атрибут помечает вашу функцию как собственную точку входа. Функцию, помеченную #[main], вызовет обработчик сброса (reset handler) после инициализации RAM.

Сначала обновите Cargo.toml, добавив крейт esp-hal. Поскольку он поддерживает несколько чипов, нужно включить тот, который мы используем (в нашем случае esp32), с помощью feature-флага.

[dependencies]
esp-hal = { version = "1.0.0", features = ["esp32"] }

Затем в main.rs настройте точку входа так:

use esp_hal::main;

#[main]
fn main() {}

Но есть ещё один шаг.

У функции входа должна быть особая сигнатура: она не должна возвращать управление. То есть возвращаемый тип должен быть ! (never type). Это говорит Rust, что ваша функция будет работать бесконечно, что типично для встраиваемых систем.

Поэтому обновим функцию main следующим образом:

#[main]
fn main() -> ! {
    loop {}
}

Уже всё?

Ура! Теперь попробуйте собрать проект: он должен скомпилироваться успешно.

Созданный бинарный файл можно проверить с помощью команды file:

file target/xtensa-esp32-none-elf/debug/std_to_no_std

Она покажет что-то вроде этого:

target/xtensa-esp32-none-elf/debug/std_to_no_std: ELF 32-bit LSB executable, Tensilica Xtensa, version 1 (SYSV), statically linked, with debug_info, not stripped

Как видите, бинарный файл собран под 32-битную цель Xtensa. Значит, базовая настройка для ESP32 работает.

Но уже всё? Пока нет. Мы прошли половину этапа: у нас есть корректный бинарный файл для ESP32, но перед запуском на реальном железе нужно сделать ещё кое-что.

Ресурсы: