From 29e343b9c20a85c84aee89be14d32ee559f324a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn-Michael?= <40151420+ldericher@users.noreply.github.com> Date: Fri, 15 Mar 2024 12:37:55 +0000 Subject: [PATCH] lock-free reading --- bluepill-rs/src/main.rs | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/bluepill-rs/src/main.rs b/bluepill-rs/src/main.rs index e97ac21..874f987 100644 --- a/bluepill-rs/src/main.rs +++ b/bluepill-rs/src/main.rs @@ -20,12 +20,13 @@ mod app { #[shared] struct Shared { - buffer: Option<&'static mut [u8; 512]>, + buffer: &'static mut [u8; 512], } #[local] struct Local { tx: Option, dma::dma1::C4>>, + txbuffer: Option<&'static mut [u8; 512]>, delay_us: timer::DelayUs, led: gpio::gpioc::PC13, } @@ -71,10 +72,11 @@ mod app { ( Shared { - buffer: Some(singleton!(: [u8; 512] = [0b01010101; 512]).unwrap()), + buffer: singleton!(: [u8; 512] = [0b01010101; 512]).unwrap(), }, Local { tx: Some(serial.tx.with_dma(dma1.4)), + txbuffer: Some(singleton!(: [u8; 512] = [0; 512]).unwrap()), // Configure timer delay_us: cx.device.TIM2.delay_us(&clocks), @@ -87,25 +89,24 @@ mod app { ) } - #[idle(local = [tx, delay_us, led], shared = [buffer])] - fn idle(mut cx: idle::Context) -> ! { - let mut tx = cx.local.tx.take().unwrap(); - + #[idle(local = [tx, txbuffer, delay_us, led], shared = [&buffer])] + fn idle(cx: idle::Context) -> ! { loop { - tx = (cx.shared.buffer).lock(|buffer| { - let buf = buffer.take().unwrap(); - let xfer = tx.write(buf); + let mut tx = cx.local.tx.take().unwrap(); + let mut txbuffer = cx.local.txbuffer.take().unwrap(); - cx.local.delay_us.delay(1.secs()); - cx.local.led.set_high(); + txbuffer.copy_from_slice(*cx.shared.buffer); + let xfer = tx.write(txbuffer); - cx.local.delay_us.delay(1.secs()); - cx.local.led.set_low(); + cx.local.delay_us.delay(1.secs()); + cx.local.led.set_high(); - let (buf, tx) = xfer.wait(); - buffer.replace(buf); - tx - }); + cx.local.delay_us.delay(1.secs()); + cx.local.led.set_low(); + + (txbuffer, tx) = xfer.wait(); + cx.local.tx.replace(tx); + cx.local.txbuffer.replace(txbuffer); } } }