Написання асинхронних задач за допомогою embassy executor

Коли ви згенерували проект за допомогою template, ви побачите свій стартовий код.

І як ми бачимо тут вже ініціалізований executor

#![allow(unused)]
fn main() {
let syst = SystemTimer::new(lilka.peripherals.SYSTIMER); //Ініціалізація таймера для executor
rustilka::hal::embassy::init(&lilka.clock, syst); //Визначаємо цей таймер для роботи
let executor = EXECUTOR.init(embassy::executor::Executor::new());//Ініціалізуємо сам executor
}

Відтепер вже ви можете писати різні таски.

Давайте, наприклад напишемо два таски для перемикання світлодіодів асинхронно.

По перше треба ініціалізувати піни для світлодіодів.

#![allow(unused)]
fn main() {
let io = IO::new(lilka.peripherals.GPIO, lilka.peripherals.IO_MUX);//ініціалізуємо GPIO
let firstled = io.pins.gpio47.into_push_pull_output();//Перший 
let secondled = io.pins.gpio14.into_push_pull_output();//Другий
}

Оскільки у вас ініціалізований в Cargo.toml embassy_executor embassy_time, нам треба за допомогою макросів вказати таск.

#![allow(unused)]
fn main() {
#[embassy_executor::task]//обов'язково над функцією(також async обов'язково прописати)
async fn first_led(mut led: GpioPin<Output<PushPull>, 47>) {
    loop {
    embassy_time::Timer::after_millis(100u64).await;//чекаємо 100 мілісекунд
    led.set_high();//вмикаємо
    embassy_time::Timer::after_millis(100u64).await;
    led.set_low();//вимикаємо

    }
}
}

Далі напишемо інший аналогічний таск, але з іншим піном

#![allow(unused)]
fn main() {
#[embassy_executor::task]
async fn second_led(mut led: GpioPin<Output<PushPull>, 14>) {//зверніть увагу на інший номер піна в типі
    loop {
    embassy_time::Timer::after_millis(1000u64).await;//чекаємо секунду
    led.set_high();
    embassy_time::Timer::after_millis(1000u64).await;
    led.set_low();

    }
}
}

Таски готові, далі нам треба вже заспавнити таски для виконання, методом та внутрішнім замиканням ми вже зможемо їх спавнити

#![allow(unused)]
fn main() {
executor.run(|spawner| {//створюємо замикання і спавнимо в цьому блоці
        spawner.spawn(first_led(firstled)).expect("failed to run first led");//Спавнимо перший світлодіод
        spawner.spawn(second_led(secondled)).expect("failed to run second led");//Спавнимо другий світлодіод
    });
}