Skip to content

Instantly share code, notes, and snippets.

@kalkyl
Last active March 2, 2025 16:55
Show Gist options
  • Save kalkyl/62003cb14c8294bbba07f069b74585e2 to your computer and use it in GitHub Desktop.
Save kalkyl/62003cb14c8294bbba07f069b74585e2 to your computer and use it in GitHub Desktop.
#![no_std]
#![no_main]
use defmt::*;
use embassy_executor::Spawner;
use embassy_rp::clocks::RoscRng;
use embassy_rp::gpio;
use embassy_sync::blocking_mutex::raw::ThreadModeRawMutex;
use embassy_sync::channel::Channel;
use embassy_sync::signal::Signal;
use embassy_time::Timer;
use gpio::{Level, Output};
use rand::RngCore;
use {defmt_rtt as _, panic_probe as _};
enum Command {
Toggle(&'static Signal<ThreadModeRawMutex, Level>),
}
static COMMANDS: Channel<ThreadModeRawMutex, Command, 8> = Channel::new();
#[embassy_executor::main]
async fn main(spawner: Spawner) {
let p = embassy_rp::init(Default::default());
let mut led = Output::new(p.PIN_25, Level::High);
spawner.must_spawn(toggle_led_task(0));
spawner.must_spawn(toggle_led_task(1));
loop {
match COMMANDS.receive().await {
Command::Toggle(response) => {
led.toggle();
response.signal(led.get_output_level());
}
}
}
}
#[embassy_executor::task(pool_size = 2)]
async fn toggle_led_task(id: u8) {
static RESPONSE: Signal<ThreadModeRawMutex, Level> = Signal::new();
loop {
let delay_time = (2_000. * (RoscRng.next_u32() as f32 / u32::MAX as f32)) as u64;
Timer::after_millis(delay_time).await;
COMMANDS.send(Command::Toggle(&RESPONSE)).await;
let response = RESPONSE.wait().await;
info!("Task {} got: {:?}", id, Debug2Format(&response));
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment