//! This example shows how to send messages between the two cores in the RP2040 chip. //! //! The LED on the RP Pico W board is connected differently. See wifi_blinky.rs. #![no_std] #![no_main] #![feature(type_alias_impl_trait)] use defmt::*; use embassy_executor::Executor; use embassy_rp::gpio::{Level, Output}; use embassy_rp::multicore::{spawn_core1, Stack}; use embassy_rp::peripherals::PIN_25; use embassy_sync::blocking_mutex::raw::CriticalSectionRawMutex; use embassy_sync::channel::Channel; use embassy_time::{Duration, Timer}; use static_cell::StaticCell; use {defmt_rtt as _, panic_probe as _}; static mut CORE1_STACK: Stack<4096> = Stack::new(); static EXECUTOR0: StaticCell = StaticCell::new(); static EXECUTOR1: StaticCell = StaticCell::new(); static CHANNEL: Channel = Channel::new(); enum LedState { On, Off, } #[cortex_m_rt::entry] fn main() -> ! { let p = embassy_rp::init(Default::default()); let led = Output::new(p.PIN_25, Level::Low); spawn_core1(p.CORE1, unsafe { &mut CORE1_STACK }, move || { let executor1 = EXECUTOR1.init(Executor::new()); executor1.run(|spawner| unwrap!(spawner.spawn(core1_task(led)))); }); let executor0 = EXECUTOR0.init(Executor::new()); executor0.run(|spawner| unwrap!(spawner.spawn(core0_task()))); } #[embassy_executor::task] async fn core0_task() { info!("Hello from core 0"); loop { CHANNEL.send(LedState::On).await; Timer::after(Duration::from_millis(100)).await; CHANNEL.send(LedState::Off).await; Timer::after(Duration::from_millis(400)).await; } } #[embassy_executor::task] async fn core1_task(mut led: Output<'static, PIN_25>) { info!("Hello from core 1"); loop { match CHANNEL.receive().await { LedState::On => led.set_high(), LedState::Off => led.set_low(), } } }