use alloc::{collections::BTreeMap, string::String, vec::Vec}; use libcortex_a9::{mutex::Mutex, cache::dcci_slice}; use crate::kernel::DmaRecorder; const ALIGNMENT: usize = 16 * 8; static DMA_RECORD_STORE: Mutex, i64)>> = Mutex::new(BTreeMap::new()); pub fn put_record(mut recorder: DmaRecorder) { recorder.buffer.reserve(ALIGNMENT - 1); let original_length = recorder.buffer.len(); let padding = ALIGNMENT - recorder.buffer.as_ptr() as usize % ALIGNMENT; let padding = if padding == ALIGNMENT { 0 } else { padding }; for _ in 0..padding { recorder.buffer.push(0); } // trailing zero to indicate end of buffer recorder.buffer.push(0); recorder.buffer.copy_within(0..original_length, padding); dcci_slice(&recorder.buffer); let ptr = recorder.buffer[padding..].as_ptr() as u32; DMA_RECORD_STORE .lock() .insert(recorder.name, (ptr, recorder.buffer, recorder.duration)); } pub fn erase(name: String) { DMA_RECORD_STORE.lock().remove(&name); } pub fn retrieve(name: String) -> Option<(i32, i64)> { let (ptr, _v, duration) = DMA_RECORD_STORE.lock().get(&name)?.clone(); Some((ptr as i32, duration)) }