From b8672458947b4d48b5d5c950a60edd677d87e29e Mon Sep 17 00:00:00 2001 From: Ulf Lilleengen Date: Wed, 10 Jan 2024 09:23:53 +0100 Subject: simplify example --- examples/rp/src/bin/blinky_two_tasks.rs | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) (limited to 'examples') diff --git a/examples/rp/src/bin/blinky_two_tasks.rs b/examples/rp/src/bin/blinky_two_tasks.rs index 7e0b531e1..a03f3a592 100644 --- a/examples/rp/src/bin/blinky_two_tasks.rs +++ b/examples/rp/src/bin/blinky_two_tasks.rs @@ -30,13 +30,11 @@ async fn main(spawner: Spawner) { let dt = 100 * 1_000_000; let k = 1.003; - unwrap!(spawner.spawn(toggle(&LED, Duration::from_nanos(dt)))); - unwrap!(spawner.spawn(toggle_slightly_slower( - &LED, - Duration::from_nanos((dt as f64 * k) as u64) - ))); + unwrap!(spawner.spawn(toggle_led(&LED, Duration::from_nanos(dt)))); + unwrap!(spawner.spawn(toggle_led(&LED, Duration::from_nanos((dt as f64 * k) as u64)))); } +#[embassy_executor::task(pool_size = 2)] async fn toggle_led(led: &'static LedType, delay: Duration) { let mut ticker = Ticker::every(delay); loop { @@ -49,12 +47,3 @@ async fn toggle_led(led: &'static LedType, delay: Duration) { ticker.next().await; } } -#[embassy_executor::task] -async fn toggle(led: &'static LedType, delay: Duration) { - toggle_led(led, delay).await -} - -#[embassy_executor::task] -async fn toggle_slightly_slower(led: &'static LedType, delay: Duration) { - toggle_led(led, delay).await -} -- cgit From ff5f5021fb4f469f72b3645760238ebe1c4d99af Mon Sep 17 00:00:00 2001 From: Ulf Lilleengen Date: Wed, 10 Jan 2024 09:48:09 +0100 Subject: cleanup docs and add channel synchronization example --- examples/rp/.cargo/config.toml | 2 +- examples/rp/src/bin/blinky_two_channels.rs | 47 ++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 examples/rp/src/bin/blinky_two_channels.rs (limited to 'examples') diff --git a/examples/rp/.cargo/config.toml b/examples/rp/.cargo/config.toml index 3d7d61740..04490c789 100644 --- a/examples/rp/.cargo/config.toml +++ b/examples/rp/.cargo/config.toml @@ -1,5 +1,5 @@ [target.'cfg(all(target_arch = "arm", target_os = "none"))'] -runner = "probe-rs run --chip RP2040" +runner = "probe-rs run --chip RP2040 --probe 1209:4853:0e0039001450563641333620" [build] target = "thumbv6m-none-eabi" # Cortex-M0 and Cortex-M0+ diff --git a/examples/rp/src/bin/blinky_two_channels.rs b/examples/rp/src/bin/blinky_two_channels.rs new file mode 100644 index 000000000..6179dc260 --- /dev/null +++ b/examples/rp/src/bin/blinky_two_channels.rs @@ -0,0 +1,47 @@ +#![no_std] +#![no_main] +/// This example demonstrates how to access a given pin from more than one embassy task +/// The on-board LED is toggled by two tasks with slightly different periods, leading to the +/// apparent duty cycle of the LED increasing, then decreasing, linearly. The phenomenon is similar +/// to interference and the 'beats' you can hear if you play two frequencies close to one another +/// [Link explaining it](https://www.physicsclassroom.com/class/sound/Lesson-3/Interference-and-Beats) +use defmt::*; +use embassy_executor::Spawner; +use embassy_rp::gpio; +use embassy_sync::blocking_mutex::raw::ThreadModeRawMutex; +use embassy_sync::channel::{Channel, Sender}; +use embassy_time::{Duration, Ticker}; +use gpio::{AnyPin, Level, Output}; +use {defmt_rtt as _, panic_probe as _}; + +enum LedState { + Toggle, +} +static CHANNEL: Channel = Channel::new(); + +#[embassy_executor::main] +async fn main(spawner: Spawner) { + let p = embassy_rp::init(Default::default()); + let mut led = Output::new(AnyPin::from(p.PIN_25), Level::High); + + let dt = 100 * 1_000_000; + let k = 1.003; + + unwrap!(spawner.spawn(toggle_led(CHANNEL.sender(), Duration::from_nanos(dt)))); + unwrap!(spawner.spawn(toggle_led(CHANNEL.sender(), Duration::from_nanos((dt as f64 * k) as u64)))); + + loop { + match CHANNEL.receive().await { + LedState::Toggle => led.toggle(), + } + } +} + +#[embassy_executor::task(pool_size = 2)] +async fn toggle_led(control: Sender<'static, ThreadModeRawMutex, LedState, 64>, delay: Duration) { + let mut ticker = Ticker::every(delay); + loop { + control.send(LedState::Toggle).await; + ticker.next().await; + } +} -- cgit From de08da0bf19f6b0f02c7803351e4c94391e1da12 Mon Sep 17 00:00:00 2001 From: Ulf Lilleengen Date: Wed, 10 Jan 2024 09:54:35 +0100 Subject: rustfmt --- examples/rp/src/bin/blinky_two_channels.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'examples') diff --git a/examples/rp/src/bin/blinky_two_channels.rs b/examples/rp/src/bin/blinky_two_channels.rs index 6179dc260..b2eec2a21 100644 --- a/examples/rp/src/bin/blinky_two_channels.rs +++ b/examples/rp/src/bin/blinky_two_channels.rs @@ -15,7 +15,7 @@ use gpio::{AnyPin, Level, Output}; use {defmt_rtt as _, panic_probe as _}; enum LedState { - Toggle, + Toggle, } static CHANNEL: Channel = Channel::new(); @@ -28,7 +28,10 @@ async fn main(spawner: Spawner) { let k = 1.003; unwrap!(spawner.spawn(toggle_led(CHANNEL.sender(), Duration::from_nanos(dt)))); - unwrap!(spawner.spawn(toggle_led(CHANNEL.sender(), Duration::from_nanos((dt as f64 * k) as u64)))); + unwrap!(spawner.spawn(toggle_led( + CHANNEL.sender(), + Duration::from_nanos((dt as f64 * k) as u64) + ))); loop { match CHANNEL.receive().await { -- cgit