diff --git a/rustmeter-beacon/rustmeter-beacon-core/src/protocol/raw_writers.rs b/rustmeter-beacon/rustmeter-beacon-core/src/protocol/raw_writers.rs index d2e3ff1..5a32164 100644 --- a/rustmeter-beacon/rustmeter-beacon-core/src/protocol/raw_writers.rs +++ b/rustmeter-beacon/rustmeter-beacon-core/src/protocol/raw_writers.rs @@ -23,7 +23,7 @@ pub fn write_embassy_task_ready(task_id: u16, executor_id: u3) { buffer[1..3].copy_from_slice(&task_id.to_le_bytes()); // Write to global buffer - let timestamp = TimeDelta::from_now(); + let timestamp = critical_section::with(|cs| TimeDelta::from_now(cs)); let pos = timestamp.write_bytes_mut(&mut buffer[3..]); unsafe { write_tracing_data(&buffer[..3 + pos]) }; } @@ -36,7 +36,7 @@ pub fn write_embassy_task_exec_begin(task_id: u16, executor_id: u3) { buffer[1..3].copy_from_slice(&task_id.to_le_bytes()); // Write to global buffer - let timestamp = TimeDelta::from_now(); + let timestamp = critical_section::with(|cs| TimeDelta::from_now(cs)); let pos = timestamp.write_bytes_mut(&mut buffer[3..]); unsafe { write_tracing_data(&buffer[..3 + pos]) }; } @@ -48,7 +48,7 @@ pub fn write_embassy_task_exec_end(executor_id: u3) { buffer[0] = (event_ids::EMBASSY_TASK_EXEC_END << 3) | executor_id.as_u8(); // Write to global buffer - let timestamp = TimeDelta::from_now(); + let timestamp = critical_section::with(|cs| TimeDelta::from_now(cs)); let pos = timestamp.write_bytes_mut(&mut buffer[1..]); unsafe { write_tracing_data(&buffer[..1 + pos]) }; } @@ -60,7 +60,7 @@ pub fn write_embassy_executor_poll_start(executor_id: u3) { buffer[0] = (event_ids::EMBASSY_EXECUTOR_POLL_START << 3) | executor_id.as_u8(); // Write to global buffer - let timestamp = TimeDelta::from_now(); + let timestamp = critical_section::with(|cs| TimeDelta::from_now(cs)); let pos = timestamp.write_bytes_mut(&mut buffer[1..]); unsafe { write_tracing_data(&buffer[..1 + pos]) }; } @@ -72,7 +72,7 @@ pub fn write_embassy_executor_idle(executor_id: u3) { buffer[0] = (event_ids::EMBASSY_EXECUTOR_IDLE << 3) | executor_id.as_u8(); // Write to global buffer - let timestamp = TimeDelta::from_now(); + let timestamp = critical_section::with(|cs| TimeDelta::from_now(cs)); let pos = timestamp.write_bytes_mut(&mut buffer[1..]); unsafe { write_tracing_data(&buffer[..1 + pos]) }; } @@ -85,7 +85,7 @@ pub fn write_monitor_start(monitor_id: u8) { buffer[1] = monitor_id; // Write to global buffer - let timestamp = TimeDelta::from_now(); + let timestamp = critical_section::with(|cs| TimeDelta::from_now(cs)); let pos = timestamp.write_bytes_mut(&mut buffer[2..]); unsafe { write_tracing_data(&buffer[..2 + pos]) }; } @@ -97,7 +97,7 @@ pub fn write_monitor_end() { buffer[0] = event_ids::MONITOR_END << 3; // Write to global buffer - let timestamp = TimeDelta::from_now(); + let timestamp = critical_section::with(|cs| TimeDelta::from_now(cs)); let pos = timestamp.write_bytes_mut(&mut buffer[1..]); unsafe { write_tracing_data(&buffer[..1 + pos]) }; } @@ -120,7 +120,7 @@ pub fn write_defmt_data(data: &[u8]) { let next_pos = 2 + chunk_size; // Write to global buffer with timestamp - let timestamp = TimeDelta::from_now(); + let timestamp = critical_section::with(|cs| TimeDelta::from_now(cs)); let pos = timestamp.write_bytes_mut(&mut buffer[next_pos..]); unsafe { write_tracing_data(&buffer[..next_pos + pos]) }; diff --git a/rustmeter-beacon/rustmeter-beacon-core/src/time_delta.rs b/rustmeter-beacon/rustmeter-beacon-core/src/time_delta.rs index 3966501..f74a22a 100644 --- a/rustmeter-beacon/rustmeter-beacon-core/src/time_delta.rs +++ b/rustmeter-beacon/rustmeter-beacon-core/src/time_delta.rs @@ -1,5 +1,6 @@ #![allow(unused)] // in test mode, things might be unused use arbitrary_int::traits::Integer; +use critical_section::CriticalSection; use crate::{ buffer::{BufferReader, BufferWriter}, @@ -85,7 +86,7 @@ impl TimeDelta { /// This has to be called inside a critical section #[inline(always)] #[cfg(not(test))] - pub fn from_now() -> Self { + pub fn from_now<'cs>(_cs: CriticalSection<'cs>) -> Self { let core_id = unsafe { crate::get_current_core_id() as usize }; if !CORE_CLOCK_REFERENCED[core_id].load(portable_atomic::Ordering::Relaxed) { do_core_clock_referencing(core_id); @@ -107,7 +108,7 @@ impl TimeDelta { } #[cfg(test)] - pub fn from_now() -> Self { + pub fn from_now<'cs>(_cs: CriticalSection<'cs>) -> Self { let now = unsafe { get_tracing_raw_ticks() }; TimeDelta { delta: now } } diff --git a/rustmeter-beacon/rustmeter-beacon-core/src/tracing.rs b/rustmeter-beacon/rustmeter-beacon-core/src/tracing.rs index cfb31dd..6eecada 100644 --- a/rustmeter-beacon/rustmeter-beacon-core/src/tracing.rs +++ b/rustmeter-beacon/rustmeter-beacon-core/src/tracing.rs @@ -19,7 +19,7 @@ pub fn write_tracing_event(event: EventPayload) { critical_section::with(|cs| { let _lock = TRACE_WRITING.borrow(cs); - let timestamp = TimeDelta::from_now(); + let timestamp = TimeDelta::from_now(cs); // Write event data let mut buffer = BufferWriter::new(); diff --git a/rustmeter-beacon/rustmeter-beacon-target/src/cortex/tracing_rtt.rs b/rustmeter-beacon/rustmeter-beacon-target/src/cortex/tracing_rtt.rs index 833f655..2a7db8f 100644 --- a/rustmeter-beacon/rustmeter-beacon-target/src/cortex/tracing_rtt.rs +++ b/rustmeter-beacon/rustmeter-beacon-target/src/cortex/tracing_rtt.rs @@ -12,7 +12,7 @@ fn write_tracing_data(data: &[u8]) { let idx = if core_id > 1 { 0 } else { core_id as usize }; // Write to Buffer - cortex_m::interrupt::free(|_| { + critical_section::with(|cs| { // Check for dropped events let dropped_events = unsafe { DROPPED_EVENTS_COUNTER[idx] }; if dropped_events > 0 { @@ -20,7 +20,7 @@ fn write_tracing_data(data: &[u8]) { let mut buffer = [0u8; 12]; buffer[0] = event_ids::DATA_LOSS_EVENT << 3; buffer[1..5].copy_from_slice(&dropped_events.to_le_bytes()); - let timestamp = TimeDelta::from_now(); + let timestamp = TimeDelta::from_now(cs); let pos = timestamp.write_bytes_mut(&mut buffer[5..]); // Try to write dropped events data diff --git a/rustmeter-beacon/rustmeter-beacon-target/src/espressif/tracing_esp.rs b/rustmeter-beacon/rustmeter-beacon-target/src/espressif/tracing_esp.rs index 4ebdd17..208bf64 100644 --- a/rustmeter-beacon/rustmeter-beacon-target/src/espressif/tracing_esp.rs +++ b/rustmeter-beacon/rustmeter-beacon-target/src/espressif/tracing_esp.rs @@ -62,7 +62,7 @@ fn write_tracing_data(data: &[u8]) { let mut buffer = [0u8; 12]; buffer[0] = event_ids::DATA_LOSS_EVENT << 3; buffer[1..5].copy_from_slice(&dropped_events.to_le_bytes()); - let timestamp = TimeDelta::from_now(); + let timestamp = critical_section::with(|cs| TimeDelta::from_now(cs)); let pos = timestamp.write_bytes_mut(&mut buffer[5..]); // Try to write dropped events data