Communicate between threads

This commit is contained in:
Sofia 2026-05-17 03:34:32 +03:00
parent 85bbc042bf
commit 5475bb6cf9

View File

@ -7,9 +7,13 @@
)] )]
#![deny(clippy::large_stack_frames)] #![deny(clippy::large_stack_frames)]
use core::mem::MaybeUninit; use core::{
cell::{Cell, RefCell},
mem::MaybeUninit,
};
use alloc::boxed::Box; use alloc::{borrow::ToOwned, boxed::Box, string::String, sync::Arc, vec::Vec};
use critical_section::{CriticalSection, Mutex};
use embassy_executor::Spawner; use embassy_executor::Spawner;
use esp_hal::{ use esp_hal::{
clock::{ClockConfig, CpuClock}, clock::{ClockConfig, CpuClock},
@ -59,23 +63,6 @@ fn main() -> ! {
let config = esp_hal::Config::default().with_cpu_clock(CpuClock::max()); let config = esp_hal::Config::default().with_cpu_clock(CpuClock::max());
let peripherals = esp_hal::init(config); let peripherals = esp_hal::init(config);
static mut THREAD_2_STACK: Stack<1024> = esp_hal::system::Stack {
mem: MaybeUninit::new([0u8; 1024]),
};
let timg0 = TimerGroup::new(peripherals.TIMG0);
let software_interrupt = SoftwareInterruptControl::new(peripherals.SW_INTERRUPT);
esp_rtos::start(timg0.timer0, software_interrupt.software_interrupt0);
esp_rtos::start_second_core(
peripherals.CPU_CTRL,
software_interrupt.software_interrupt1,
unsafe {
#[allow(static_mut_refs)]
&mut THREAD_2_STACK
},
|| thread_2_main(),
);
// The following pins are used to bootstrap the chip. They are available // The following pins are used to bootstrap the chip. They are available
// for use, but check the datasheet of the module for more information on them. // for use, but check the datasheet of the module for more information on them.
// - GPIO0 // - GPIO0
@ -170,19 +157,52 @@ fn main() -> ! {
// let input_6 = Input::new(peripherals.GPIO26, pull_up_cfg); // let input_6 = Input::new(peripherals.GPIO26, pull_up_cfg);
// let input_7 = Input::new(peripherals.GPIO27, pull_up_cfg); // let input_7 = Input::new(peripherals.GPIO27, pull_up_cfg);
let messages = Arc::new(Mutex::new(RefCell::new(Vec::<String>::new())));
static mut THREAD_2_STACK: Stack<1024> = esp_hal::system::Stack {
mem: MaybeUninit::new([0u8; 1024]),
};
let timg0 = TimerGroup::new(peripherals.TIMG0);
let software_interrupt = SoftwareInterruptControl::new(peripherals.SW_INTERRUPT);
esp_rtos::start(timg0.timer0, software_interrupt.software_interrupt0);
esp_rtos::start_second_core(
peripherals.CPU_CTRL,
software_interrupt.software_interrupt1,
unsafe {
#[allow(static_mut_refs)]
&mut THREAD_2_STACK
},
{
let messages = messages.clone();
|| thread_2_main(messages)
},
);
let mut test_delay = Delay::new(); let mut test_delay = Delay::new();
loop { loop {
state_mgr.update(); critical_section::with(|cs| {
state_mgr.draw(); let mut borrowed = messages.borrow(cs).borrow_mut();
for message in borrowed.iter() {
log::info!("Received: {}", message);
}
borrowed.clear();
})
// state_mgr.update();
// state_mgr.draw();
} }
// for inspiration have a look at the examples at https://github.com/esp-rs/esp-hal/tree/esp-hal-v1.1.0/examples // for inspiration have a look at the examples at https://github.com/esp-rs/esp-hal/tree/esp-hal-v1.1.0/examples
} }
fn thread_2_main() { fn thread_2_main(messages: Arc<Mutex<RefCell<Vec<String>>>>) {
let delay = Delay::new(); let delay = Delay::new();
loop { loop {
delay.delay_millis(1000); delay.delay_millis(1000);
log::info!("Hello there!") log::info!("Sent message");
critical_section::with(|cs| {
let mut borrowed = messages.borrow(cs).borrow_mut();
borrowed.push("Message!".to_owned());
})
} }
} }