Skip to content

Embassy compatibility #49

@Serhii-the-Dev

Description

@Serhii-the-Dev

The Embassy project imposes first-class async support in the Rust embedded world including wake-on-interrupt scenarios which may be extremely helpful in certain scenarios. Alas, this HAL crate is not compatible with embassy as it's not providing a generic timer driver.

My build.rs:

use std::env;
use std::fs::File;
use std::io::Write;
use std::path::PathBuf;

fn main() {
    // Put `memory.x` in our output directory and ensure it's
    // on the linker search path.
    let out = &PathBuf::from(env::var_os("OUT_DIR").unwrap());
    File::create(out.join("memory.x"))
        .unwrap()
        .write_all(include_bytes!("memory.x"))
        .unwrap();
    println!("cargo:rustc-link-search={}", out.display());

    // By default, Cargo will re-run a build script whenever
    // any file in the project changes. By specifying `memory.x`
    // here, we ensure the build script is only re-run when
    // `memory.x` is changed.
    println!("cargo:rerun-if-changed=memory.x");

    println!("cargo:rustc-link-arg-bins=--nmagic");
    println!("cargo:rustc-link-arg-bins=-Tlink.x");
    println!("cargo:rustc-link-arg-bins=-Tdefmt.x");
}

and the main file:

#![no_std]
#![no_main]

use defmt::*;
use embassy_executor::Spawner;
use embassy_time::Timer;
use gd32f1x0_hal::{pac, prelude::*};
use {defmt_rtt as _, panic_probe as _};

#[embassy_executor::main]
async fn main(_spawner: Spawner) {
    loop {
        Timer::after_millis(1000).await;
        info!("one more second")
    }
}

Error on cargo build:

  = note: rust-lld: error: undefined symbol: _embassy_time_now
          >>> referenced by lib.rs:146 (src/lib.rs:146)
          >>>               embassy_time_driver-faf69ddeeee7d3fa.embassy_time_driver.71181d876a0d80ab-cgu.0.rcgu.o:(embassy_time_driver::now::h00fe3dbe3ce1d7f3) in archive /home/serhii/work/rusty-gd32/target/thumbv7m-none-eabi/debug/deps/libembassy_time_driver-faf69ddeeee7d3fa.rlib
          
          rust-lld: error: undefined symbol: _embassy_time_allocate_alarm
          >>> referenced by lib.rs:153 (src/lib.rs:153)
          >>>               embassy_time_driver-faf69ddeeee7d3fa.embassy_time_driver.71181d876a0d80ab-cgu.0.rcgu.o:(embassy_time_driver::allocate_alarm::h65b3cb5669a83b80) in archive /home/serhii/work/rusty-gd32/target/thumbv7m-none-eabi/debug/deps/libembassy_time_driver-faf69ddeeee7d3fa.rlib
          
          rust-lld: error: undefined symbol: _embassy_time_set_alarm_callback
          >>> referenced by lib.rs:158 (src/lib.rs:158)
          >>>               embassy_time_driver-faf69ddeeee7d3fa.embassy_time_driver.71181d876a0d80ab-cgu.0.rcgu.o:(embassy_time_driver::set_alarm_callback::h61450a8a8b58bacf) in archive /home/serhii/work/rusty-gd32/target/thumbv7m-none-eabi/debug/deps/libembassy_time_driver-faf69ddeeee7d3fa.rlib
          
          rust-lld: error: undefined symbol: _embassy_time_set_alarm
          >>> referenced by lib.rs:163 (src/lib.rs:163)
          >>>               embassy_time_driver-faf69ddeeee7d3fa.embassy_time_driver.71181d876a0d80ab-cgu.0.rcgu.o:(embassy_time_driver::set_alarm::h3bb1783fe163909a) in archive /home/serhii/work/rusty-gd32/target/thumbv7m-none-eabi/debug/deps/libembassy_time_driver-faf69ddeeee7d3fa.rlib

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions