2023-06-08 16:26:47 +01:00
|
|
|
//! Memory manager routines
|
|
|
|
|
2023-06-12 12:27:51 +01:00
|
|
|
use embassy_stm32::ipcc::Ipcc;
|
|
|
|
|
|
|
|
use crate::evt::EvtPacket;
|
|
|
|
use crate::tables::MemManagerTable;
|
|
|
|
use crate::unsafe_linked_list::LinkedListNode;
|
|
|
|
use crate::{
|
|
|
|
channels, BLE_SPARE_EVT_BUF, EVT_POOL, FREE_BUF_QUEUE, LOCAL_FREE_BUF_QUEUE, POOL_SIZE, SYS_SPARE_EVT_BUF,
|
2023-06-16 20:15:03 -05:00
|
|
|
TL_MEM_MANAGER_TABLE,
|
2023-05-02 12:16:48 +01:00
|
|
|
};
|
|
|
|
|
2023-06-08 16:26:47 +01:00
|
|
|
pub(super) struct MemoryManager;
|
2023-05-02 12:16:48 +01:00
|
|
|
|
|
|
|
impl MemoryManager {
|
2023-06-12 12:27:51 +01:00
|
|
|
pub fn enable() {
|
2023-05-02 12:16:48 +01:00
|
|
|
unsafe {
|
2023-06-08 16:26:47 +01:00
|
|
|
LinkedListNode::init_head(FREE_BUF_QUEUE.as_mut_ptr());
|
2023-05-20 10:11:29 -05:00
|
|
|
LinkedListNode::init_head(LOCAL_FREE_BUF_QUEUE.as_mut_ptr());
|
2023-05-02 12:16:48 +01:00
|
|
|
|
2023-06-13 17:12:34 -05:00
|
|
|
TL_MEM_MANAGER_TABLE.as_mut_ptr().write_volatile(MemManagerTable {
|
2023-05-02 12:16:48 +01:00
|
|
|
spare_ble_buffer: BLE_SPARE_EVT_BUF.as_ptr().cast(),
|
|
|
|
spare_sys_buffer: SYS_SPARE_EVT_BUF.as_ptr().cast(),
|
2023-06-08 16:26:47 +01:00
|
|
|
blepool: EVT_POOL.as_ptr().cast(),
|
|
|
|
blepoolsize: POOL_SIZE as u32,
|
|
|
|
pevt_free_buffer_queue: FREE_BUF_QUEUE.as_mut_ptr(),
|
2023-05-02 12:16:48 +01:00
|
|
|
traces_evt_pool: core::ptr::null(),
|
2023-06-08 16:26:47 +01:00
|
|
|
tracespoolsize: 0,
|
2023-05-02 12:16:48 +01:00
|
|
|
});
|
|
|
|
}
|
2023-05-15 10:25:02 +01:00
|
|
|
}
|
|
|
|
|
2023-05-26 09:56:55 +01:00
|
|
|
pub fn evt_drop(evt: *mut EvtPacket) {
|
2023-06-17 10:44:36 -05:00
|
|
|
// unsafe {
|
|
|
|
// let list_node = evt.cast();
|
|
|
|
//
|
|
|
|
// LinkedListNode::insert_tail(LOCAL_FREE_BUF_QUEUE.as_mut_ptr(), list_node);
|
|
|
|
//
|
|
|
|
// let channel_is_busy = Ipcc::c1_is_active_flag(channels::cpu1::IPCC_MM_RELEASE_BUFFER_CHANNEL);
|
|
|
|
//
|
|
|
|
// // postpone event buffer freeing to IPCC interrupt handler
|
|
|
|
// if channel_is_busy {
|
|
|
|
// Ipcc::c1_set_tx_channel(channels::cpu1::IPCC_MM_RELEASE_BUFFER_CHANNEL, true);
|
|
|
|
// } else {
|
|
|
|
// Self::send_free_buf();
|
|
|
|
// Ipcc::c1_set_flag_channel(channels::cpu1::IPCC_MM_RELEASE_BUFFER_CHANNEL);
|
|
|
|
// }
|
|
|
|
// }
|
2023-05-15 10:25:02 +01:00
|
|
|
}
|
|
|
|
|
2023-06-08 16:26:47 +01:00
|
|
|
/// gives free event buffers back to CPU2 from local buffer queue
|
|
|
|
pub fn send_free_buf() {
|
2023-06-17 10:44:36 -05:00
|
|
|
// unsafe {
|
|
|
|
// while let Some(node_ptr) = LinkedListNode::remove_head(LOCAL_FREE_BUF_QUEUE.as_mut_ptr()) {
|
|
|
|
// LinkedListNode::insert_head(FREE_BUF_QUEUE.as_mut_ptr(), node_ptr);
|
|
|
|
// }
|
|
|
|
// }
|
2023-05-15 10:25:02 +01:00
|
|
|
}
|
2023-06-08 16:26:47 +01:00
|
|
|
|
|
|
|
/// free buffer channel interrupt handler
|
|
|
|
pub fn free_buf_handler() {
|
2023-06-17 10:44:36 -05:00
|
|
|
// Ipcc::c1_set_tx_channel(channels::cpu1::IPCC_MM_RELEASE_BUFFER_CHANNEL, false);
|
|
|
|
// Self::send_free_buf();
|
|
|
|
// Ipcc::c1_set_flag_channel(channels::cpu1::IPCC_MM_RELEASE_BUFFER_CHANNEL);
|
2023-06-08 16:26:47 +01:00
|
|
|
}
|
2023-05-02 12:16:48 +01:00
|
|
|
}
|