summaryrefslogtreecommitdiff
path: root/nrf-softdevice
diff options
context:
space:
mode:
authorDario Nieuwenhuis <dirbaio@dirbaio.net>2021-11-26 04:17:26 +0100
committerDario Nieuwenhuis <dirbaio@dirbaio.net>2021-11-26 04:20:33 +0100
commit64deb3228950865b12a70bff9f1f01e5b4d1db10 (patch)
tree9489d55f26d26246ea67467f41856447b7b15dd8 /nrf-softdevice
parente8ee3a7cdc28eac8ce57a811ac01c75ccadbd839 (diff)
downloadnrf-softdevice-64deb3228950865b12a70bff9f1f01e5b4d1db10.zip
Use AtomicWaker instead of Signal for event handling.
It's slightly more lightweight!
Diffstat (limited to 'nrf-softdevice')
-rw-r--r--nrf-softdevice/Cargo.toml1
-rw-r--r--nrf-softdevice/src/events.rs57
2 files changed, 31 insertions, 27 deletions
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();
}