From 64deb3228950865b12a70bff9f1f01e5b4d1db10 Mon Sep 17 00:00:00 2001 From: Dario Nieuwenhuis Date: Fri, 26 Nov 2021 04:17:26 +0100 Subject: Use AtomicWaker instead of Signal for event handling. It's slightly more lightweight! --- nrf-softdevice/Cargo.toml | 1 + nrf-softdevice/src/events.rs | 57 +++++++++++++++++++++++--------------------- 2 files changed, 31 insertions(+), 27 deletions(-) (limited to 'nrf-softdevice') diff --git a/nrf-softdevice/Cargo.toml b/nrf-softdevice/Cargo.toml index 27ebf35..2f17e6b 100644 --- a/nrf-softdevice/Cargo.toml +++ b/nrf-softdevice/Cargo.toml @@ -40,6 +40,7 @@ cortex-m = "0.7.2" cortex-m-rt = ">=0.6.15,<0.8" heapless = "0.7.1" fixed = "1.5.0" +futures = { version = "0.3.17", default-features = false } nrf52805-pac = { version = "0.10.0", features = ["rt"], optional = true } nrf52810-pac = { version = "0.10.0", features = ["rt"], optional = true } diff --git a/nrf-softdevice/src/events.rs b/nrf-softdevice/src/events.rs index f74f256..bae549d 100644 --- a/nrf-softdevice/src/events.rs +++ b/nrf-softdevice/src/events.rs @@ -1,13 +1,15 @@ use core::convert::TryFrom; use core::mem::MaybeUninit; +use core::task::Poll; +use embassy::waitqueue::AtomicWaker; +use futures::future::poll_fn; use num_enum::{IntoPrimitive, TryFromPrimitive}; use crate::pac::interrupt; use crate::raw; -use crate::util::Signal; use crate::RawError; -static SWI2_SIGNAL: Signal<()> = Signal::new(); +static SWI2_WAKER: AtomicWaker = AtomicWaker::new(); #[rustfmt::skip] #[repr(u32)] @@ -49,45 +51,46 @@ fn on_soc_evt(evt: u32) { const BLE_EVT_MAX_SIZE: u16 = 128; pub(crate) async fn run() { - loop { - SWI2_SIGNAL.wait().await; + poll_fn(|cx| unsafe { + SWI2_WAKER.register(cx.waker()); - unsafe { - let mut evt: u32 = 0; - loop { - match RawError::convert(raw::sd_evt_get(&mut evt as _)) { - Ok(()) => on_soc_evt(evt), - Err(RawError::NotFound) => break, - Err(err) => panic!("sd_evt_get err {:?}", err), - } + let mut evt: u32 = 0; + loop { + match RawError::convert(raw::sd_evt_get(&mut evt as _)) { + Ok(()) => on_soc_evt(evt), + Err(RawError::NotFound) => break, + Err(err) => panic!("sd_evt_get err {:?}", err), } + } - // Using u32 since the buffer has to be aligned to 4 - let mut evt: MaybeUninit<[u32; BLE_EVT_MAX_SIZE as usize / 4]> = MaybeUninit::uninit(); + // Using u32 since the buffer has to be aligned to 4 + let mut evt: MaybeUninit<[u32; BLE_EVT_MAX_SIZE as usize / 4]> = MaybeUninit::uninit(); - loop { - let mut len: u16 = BLE_EVT_MAX_SIZE; - let ret = raw::sd_ble_evt_get(evt.as_mut_ptr() as *mut u8, &mut len as _); - match RawError::convert(ret) { - Ok(()) => crate::ble::on_evt(evt.as_ptr() as *const raw::ble_evt_t), - Err(RawError::NotFound) => break, - Err(RawError::BleNotEnabled) => break, - Err(RawError::NoMem) => panic!("BUG: BLE_EVT_MAX_SIZE is too low"), - Err(err) => panic!("sd_ble_evt_get err {:?}", err), - } + loop { + let mut len: u16 = BLE_EVT_MAX_SIZE; + let ret = raw::sd_ble_evt_get(evt.as_mut_ptr() as *mut u8, &mut len as _); + match RawError::convert(ret) { + Ok(()) => crate::ble::on_evt(evt.as_ptr() as *const raw::ble_evt_t), + Err(RawError::NotFound) => break, + Err(RawError::BleNotEnabled) => break, + Err(RawError::NoMem) => panic!("BUG: BLE_EVT_MAX_SIZE is too low"), + Err(err) => panic!("sd_ble_evt_get err {:?}", err), } } - } + + Poll::<()>::Pending + }) + .await; } #[cfg(any(feature = "nrf52805", feature = "nrf52810", feature = "nrf52811"))] #[interrupt] unsafe fn SWI2() { - SWI2_SIGNAL.signal(()); + SWI2_WAKER.wake(); } #[cfg(not(any(feature = "nrf52805", feature = "nrf52810", feature = "nrf52811")))] #[interrupt] unsafe fn SWI2_EGU2() { - SWI2_SIGNAL.signal(()); + SWI2_WAKER.wake(); } -- cgit v1.2.3