diff options
Diffstat (limited to 'embassy-stm32-wpan/src/sub/mm.rs')
| -rw-r--r-- | embassy-stm32-wpan/src/sub/mm.rs | 37 |
1 files changed, 20 insertions, 17 deletions
diff --git a/embassy-stm32-wpan/src/sub/mm.rs b/embassy-stm32-wpan/src/sub/mm.rs index a90c6ee55..aac252929 100644 --- a/embassy-stm32-wpan/src/sub/mm.rs +++ b/embassy-stm32-wpan/src/sub/mm.rs | |||
| @@ -5,26 +5,26 @@ use core::task::Poll; | |||
| 5 | 5 | ||
| 6 | use aligned::{A4, Aligned}; | 6 | use aligned::{A4, Aligned}; |
| 7 | use cortex_m::interrupt; | 7 | use cortex_m::interrupt; |
| 8 | use embassy_stm32::ipcc::Ipcc; | 8 | use embassy_stm32::ipcc::IpccTxChannel; |
| 9 | use embassy_sync::waitqueue::AtomicWaker; | 9 | use embassy_sync::waitqueue::AtomicWaker; |
| 10 | 10 | ||
| 11 | use crate::consts::POOL_SIZE; | 11 | use crate::consts::POOL_SIZE; |
| 12 | use crate::evt; | ||
| 12 | use crate::evt::EvtPacket; | 13 | use crate::evt::EvtPacket; |
| 13 | #[cfg(feature = "ble")] | 14 | #[cfg(feature = "ble")] |
| 14 | use crate::tables::BLE_SPARE_EVT_BUF; | 15 | use crate::tables::BLE_SPARE_EVT_BUF; |
| 15 | use crate::tables::{EVT_POOL, FREE_BUF_QUEUE, MemManagerTable, SYS_SPARE_EVT_BUF, TL_MEM_MANAGER_TABLE}; | 16 | use crate::tables::{EVT_POOL, FREE_BUF_QUEUE, MemManagerTable, SYS_SPARE_EVT_BUF, TL_MEM_MANAGER_TABLE}; |
| 16 | use crate::unsafe_linked_list::LinkedListNode; | 17 | use crate::unsafe_linked_list::LinkedListNode; |
| 17 | use crate::{channels, evt}; | ||
| 18 | 18 | ||
| 19 | static MM_WAKER: AtomicWaker = AtomicWaker::new(); | 19 | static MM_WAKER: AtomicWaker = AtomicWaker::new(); |
| 20 | static mut LOCAL_FREE_BUF_QUEUE: Aligned<A4, MaybeUninit<LinkedListNode>> = Aligned(MaybeUninit::uninit()); | 20 | static mut LOCAL_FREE_BUF_QUEUE: Aligned<A4, MaybeUninit<LinkedListNode>> = Aligned(MaybeUninit::uninit()); |
| 21 | 21 | ||
| 22 | pub struct MemoryManager { | 22 | pub struct MemoryManager<'a> { |
| 23 | _private: (), | 23 | ipcc_mm_release_buffer_channel: IpccTxChannel<'a>, |
| 24 | } | 24 | } |
| 25 | 25 | ||
| 26 | impl MemoryManager { | 26 | impl<'a> MemoryManager<'a> { |
| 27 | pub(crate) fn new() -> Self { | 27 | pub(crate) fn new(ipcc_mm_release_buffer_channel: IpccTxChannel<'a>) -> Self { |
| 28 | unsafe { | 28 | unsafe { |
| 29 | LinkedListNode::init_head(FREE_BUF_QUEUE.as_mut_ptr()); | 29 | LinkedListNode::init_head(FREE_BUF_QUEUE.as_mut_ptr()); |
| 30 | LinkedListNode::init_head(LOCAL_FREE_BUF_QUEUE.as_mut_ptr()); | 30 | LinkedListNode::init_head(LOCAL_FREE_BUF_QUEUE.as_mut_ptr()); |
| @@ -43,10 +43,12 @@ impl MemoryManager { | |||
| 43 | }); | 43 | }); |
| 44 | } | 44 | } |
| 45 | 45 | ||
| 46 | Self { _private: () } | 46 | Self { |
| 47 | ipcc_mm_release_buffer_channel, | ||
| 48 | } | ||
| 47 | } | 49 | } |
| 48 | 50 | ||
| 49 | pub async fn run_queue(&self) -> ! { | 51 | pub async fn run_queue(&mut self) -> ! { |
| 50 | loop { | 52 | loop { |
| 51 | poll_fn(|cx| unsafe { | 53 | poll_fn(|cx| unsafe { |
| 52 | MM_WAKER.register(cx.waker()); | 54 | MM_WAKER.register(cx.waker()); |
| @@ -58,20 +60,21 @@ impl MemoryManager { | |||
| 58 | }) | 60 | }) |
| 59 | .await; | 61 | .await; |
| 60 | 62 | ||
| 61 | Ipcc::send(channels::cpu1::IPCC_MM_RELEASE_BUFFER_CHANNEL, || { | 63 | self.ipcc_mm_release_buffer_channel |
| 62 | interrupt::free(|_| unsafe { | 64 | .send(|| { |
| 63 | // CS required while moving nodes | 65 | interrupt::free(|_| unsafe { |
| 64 | while let Some(node_ptr) = LinkedListNode::remove_head(LOCAL_FREE_BUF_QUEUE.as_mut_ptr()) { | 66 | // CS required while moving nodes |
| 65 | LinkedListNode::insert_head(FREE_BUF_QUEUE.as_mut_ptr(), node_ptr); | 67 | while let Some(node_ptr) = LinkedListNode::remove_head(LOCAL_FREE_BUF_QUEUE.as_mut_ptr()) { |
| 66 | } | 68 | LinkedListNode::insert_head(FREE_BUF_QUEUE.as_mut_ptr(), node_ptr); |
| 69 | } | ||
| 70 | }) | ||
| 67 | }) | 71 | }) |
| 68 | }) | 72 | .await; |
| 69 | .await; | ||
| 70 | } | 73 | } |
| 71 | } | 74 | } |
| 72 | } | 75 | } |
| 73 | 76 | ||
| 74 | impl evt::MemoryManager for MemoryManager { | 77 | impl<'a> evt::MemoryManager for MemoryManager<'a> { |
| 75 | /// SAFETY: passing a pointer to something other than a managed event packet is UB | 78 | /// SAFETY: passing a pointer to something other than a managed event packet is UB |
| 76 | unsafe fn drop_event_packet(evt: *mut EvtPacket) { | 79 | unsafe fn drop_event_packet(evt: *mut EvtPacket) { |
| 77 | interrupt::free(|_| unsafe { | 80 | interrupt::free(|_| unsafe { |
