From d16ad16bd7ff56fa4dcfb1a0832f556c7931d000 Mon Sep 17 00:00:00 2001 From: Oleksandr Babak Date: Thu, 15 May 2025 16:49:20 +0200 Subject: export: cortex_source_mask update --- rtic/src/export/cortex_source_mask.rs | 50 ++++++++++++++++++++--------------- 1 file changed, 28 insertions(+), 22 deletions(-) diff --git a/rtic/src/export/cortex_source_mask.rs b/rtic/src/export/cortex_source_mask.rs index 9dec5c7..4fb62a4 100644 --- a/rtic/src/export/cortex_source_mask.rs +++ b/rtic/src/export/cortex_source_mask.rs @@ -127,25 +127,27 @@ pub unsafe fn lock( masks: &[Mask; 3], f: impl FnOnce(&mut T) -> R, ) -> R { - if ceiling >= 4 { - // safe to manipulate outside critical section - // execute closure under protection of raised system ceiling - - // safe to manipulate outside critical section - critical_section::with(|_| f(&mut *ptr)) - } else { - // safe to manipulate outside critical section - let mask = compute_mask(0, ceiling, masks); - let old_mask = read_mask(mask); - clear_enable_mask(mask); - - // execute closure under protection of raised system ceiling - let r = f(&mut *ptr); - - set_enable_mask(mask, old_mask); - - // safe to manipulate outside critical section - r + unsafe { + if ceiling >= 4 { + // safe to manipulate outside critical section + // execute closure under protection of raised system ceiling + + // safe to manipulate outside critical section + critical_section::with(|_| f(&mut *ptr)) + } else { + // safe to manipulate outside critical section + let mask = compute_mask(0, ceiling, masks); + let old_mask = read_mask(mask); + clear_enable_mask(mask); + + // execute closure under protection of raised system ceiling + let r = f(&mut *ptr); + + set_enable_mask(mask, old_mask); + + // safe to manipulate outside critical section + r + } } } @@ -187,7 +189,7 @@ unsafe fn read_mask(mask: Mask) -> Mask { for i in 0..M { // This check should involve compile time constants and be optimized out. if mask.0[i] != 0 { - out.0[i] = (*NVIC::PTR).iser[i].read(); + out.0[i] = unsafe { (*NVIC::PTR).iser[i].read() }; } } @@ -200,7 +202,9 @@ unsafe fn set_enable_mask(mask: Mask, old_mask: Mask) { for i in 0..M { // This check should involve compile time constants and be optimized out. if mask.0[i] != 0 { - (*NVIC::PTR).iser[i].write(old_mask.0[i]); + unsafe { + (*NVIC::PTR).iser[i].write(old_mask.0[i]); + } } } } @@ -211,7 +215,9 @@ unsafe fn clear_enable_mask(mask: Mask) { for i in 0..M { // This check should involve compile time constants and be optimized out. if mask.0[i] != 0 { - (*NVIC::PTR).icer[i].write(mask.0[i]); + unsafe { + (*NVIC::PTR).icer[i].write(mask.0[i]); + } } } } -- cgit v1.2.3