diff --git a/rp2040-hal-examples/Cargo.toml b/rp2040-hal-examples/Cargo.toml index 7529eb2df..6e524fab9 100644 --- a/rp2040-hal-examples/Cargo.toml +++ b/rp2040-hal-examples/Cargo.toml @@ -29,7 +29,6 @@ fugit = "0.3.6" futures = {version = "0.3.30", default-features = false, features = ["async-await"]} hd44780-driver = "0.4.0" nb = "1.0" -nostd_async = {version = "0.6.1", features = ["cortex_m"]} panic-halt = "0.2.0" panic-probe = {version = "0.3.1", features = ["print-defmt"]} pio = "0.2.0" @@ -39,3 +38,7 @@ pio-proc = "0.2.0" portable-atomic = {version = "1.7.0", features = ["critical-section"]} rp2040-boot2 = "0.3.0" rp2040-hal = {path = "../rp2040-hal", version = "0.10.0", features = ["binary-info", "critical-section-impl", "rt", "defmt"]} +static_cell = "2.1.0" + +[target.'cfg( target_arch = "arm" )'.dependencies] +embassy-executor = {version = "0.5", features = ["arch-cortex-m", "executor-thread"]} diff --git a/rp2040-hal-examples/src/bin/i2c_async.rs b/rp2040-hal-examples/src/bin/i2c_async.rs index 79c4fd1ed..9e490e786 100644 --- a/rp2040-hal-examples/src/bin/i2c_async.rs +++ b/rp2040-hal-examples/src/bin/i2c_async.rs @@ -26,12 +26,14 @@ use hal::{ }; // Import required types & traits. +use embassy_executor::Executor; use embedded_hal_async::i2c::I2c; use hal::{ gpio::{FunctionI2C, Pin, PullUp}, pac::{self, interrupt}, Clock, }; +use static_cell::StaticCell; /// The linker will place this boot block at the start of our program image. We /// need this to help the ROM bootloader get our code up and running. @@ -54,6 +56,7 @@ unsafe fn I2C0_IRQ() { /// The function configures the RP2040 peripherals, then performs a single I²C /// write to a fixed address. +#[embassy_executor::task] async fn demo() { let mut pac = pac::Peripherals::take().unwrap(); @@ -118,9 +121,7 @@ async fn demo() { /// Entry point to our bare-metal application. #[rp2040_hal::entry] fn main() -> ! { - let runtime = nostd_async::Runtime::new(); - let mut task = nostd_async::Task::new(demo()); - let handle = task.spawn(&runtime); - handle.join(); - unreachable!() + static EXECUTOR: StaticCell = StaticCell::new(); + let executor = EXECUTOR.init(Executor::new()); + executor.run(|spawner| spawner.spawn(demo()).unwrap()); } diff --git a/rp2040-hal-examples/src/bin/i2c_async_cancelled.rs b/rp2040-hal-examples/src/bin/i2c_async_cancelled.rs index 17092aa7d..90ac5a065 100644 --- a/rp2040-hal-examples/src/bin/i2c_async_cancelled.rs +++ b/rp2040-hal-examples/src/bin/i2c_async_cancelled.rs @@ -38,7 +38,9 @@ use hal::{ }; use defmt_rtt as _; +use embassy_executor::Executor; use panic_probe as _; +use static_cell::StaticCell; /// The linker will place this boot block at the start of our program image. We /// need this to help the ROM bootloader get our code up and running. @@ -60,6 +62,7 @@ unsafe fn I2C0_IRQ() { /// The function configures the RP2040 peripherals, then performs a single I²C /// write to a fixed address. +#[embassy_executor::task] async fn demo() { let mut pac = pac::Peripherals::take().unwrap(); @@ -142,9 +145,7 @@ async fn demo() { /// Entry point to our bare-metal application. #[rp2040_hal::entry] fn main() -> ! { - let runtime = nostd_async::Runtime::new(); - let mut task = nostd_async::Task::new(demo()); - let handle = task.spawn(&runtime); - handle.join(); - unreachable!() + static EXECUTOR: StaticCell = StaticCell::new(); + let executor = EXECUTOR.init(Executor::new()); + executor.run(|spawner| spawner.spawn(demo()).unwrap()); } diff --git a/rp235x-hal-examples/Cargo.toml b/rp235x-hal-examples/Cargo.toml index bb9f25f7e..f9a1295cb 100644 --- a/rp235x-hal-examples/Cargo.toml +++ b/rp235x-hal-examples/Cargo.toml @@ -29,10 +29,16 @@ futures = {version = "0.3.30", default-features = false, features = ["async-awai hd44780-driver = "0.4.0" heapless = "0.8.0" nb = "1.0" -nostd_async = {version = "0.6.1", features = ["cortex_m"]} panic-halt = "0.2.0" pio = "0.2.0" pio-proc = "0.2.0" rp235x-hal = {path = "../rp235x-hal", version = "0.2.0", features = ["binary-info", "critical-section-impl", "rt", "defmt"]} usb-device = "0.3.2" usbd-serial = "0.2.2" +static_cell = "2.1.0" + +[target.'cfg( target_arch = "arm" )'.dependencies] +embassy-executor = {version = "0.5", features = ["arch-cortex-m", "executor-thread"]} + +[target.'cfg( target_arch = "riscv32" )'.dependencies] +embassy-executor = {version = "0.5", features = ["arch-riscv32", "executor-thread"]} diff --git a/rp235x-hal-examples/src/bin/i2c_async.rs b/rp235x-hal-examples/src/bin/i2c_async.rs index 8b104bc99..291cc1439 100644 --- a/rp235x-hal-examples/src/bin/i2c_async.rs +++ b/rp235x-hal-examples/src/bin/i2c_async.rs @@ -28,7 +28,9 @@ use hal::{ }; // Import required types & traits. +use embassy_executor::Executor; use embedded_hal_async::i2c::I2c; +use static_cell::StaticCell; /// Tell the Boot ROM about our application #[link_section = ".start_block"] @@ -48,6 +50,7 @@ unsafe fn I2C0_IRQ() { /// The function configures the RP235x peripherals, then performs a single I²C /// write to a fixed address. +#[embassy_executor::task] async fn demo() { let mut pac = hal::pac::Peripherals::take().unwrap(); @@ -112,11 +115,9 @@ async fn demo() { /// Entry point to our bare-metal application. #[hal::entry] fn main() -> ! { - let runtime = nostd_async::Runtime::new(); - let mut task = nostd_async::Task::new(demo()); - let handle = task.spawn(&runtime); - handle.join(); - unreachable!() + static EXECUTOR: StaticCell = StaticCell::new(); + let executor = EXECUTOR.init(Executor::new()); + executor.run(|spawner| spawner.spawn(demo()).unwrap()); } /// Program metadata for `picotool info` diff --git a/rp235x-hal-examples/src/bin/i2c_async_cancelled.rs b/rp235x-hal-examples/src/bin/i2c_async_cancelled.rs index f9b069389..f85240e9c 100644 --- a/rp235x-hal-examples/src/bin/i2c_async_cancelled.rs +++ b/rp235x-hal-examples/src/bin/i2c_async_cancelled.rs @@ -32,6 +32,8 @@ use hal::{ }; use defmt_rtt as _; +use embassy_executor::Executor; +use static_cell::StaticCell; /// Tell the Boot ROM about our application #[link_section = ".start_block"] @@ -50,6 +52,7 @@ unsafe fn I2C0_IRQ() { /// The function configures the RP235x peripherals, then performs a single I²C /// write to a fixed address. +#[embassy_executor::task] async fn demo() { let mut pac = hal::pac::Peripherals::take().unwrap(); @@ -132,11 +135,9 @@ async fn demo() { /// Entry point to our bare-metal application. #[hal::entry] fn main() -> ! { - let runtime = nostd_async::Runtime::new(); - let mut task = nostd_async::Task::new(demo()); - let handle = task.spawn(&runtime); - handle.join(); - unreachable!() + static EXECUTOR: StaticCell = StaticCell::new(); + let executor = EXECUTOR.init(Executor::new()); + executor.run(|spawner| spawner.spawn(demo()).unwrap()); } /// Program metadata for `picotool info`