Fix alarm schedule() race condition.

This commit is contained in:
Weird Constructor 2022-01-12 06:41:03 +01:00
parent 0e3136da11
commit 7a23247ca1

View file

@ -249,17 +249,19 @@ macro_rules! impl_alarm {
if duration < MIN_MICROSECONDS { if duration < MIN_MICROSECONDS {
return Err(ScheduleAlarmError::AlarmTooSoon); return Err(ScheduleAlarmError::AlarmTooSoon);
} else { } else {
// safety: This is a read action and should not have any UB cortex_m::interrupt::free(|_| {
let target_time = unsafe { &*TIMER::ptr() } // safety: This is a read action and should not have any UB
.timelr let target_time = unsafe { &*TIMER::ptr() }
.read() .timelr
.bits() .read()
.wrapping_add(duration); .bits()
.wrapping_add(duration);
// safety: This is the only code in the codebase that accesses memory address $timer_alarm // safety: This is the only code in the codebase that accesses memory address $timer_alarm
unsafe { &*TIMER::ptr() } unsafe { &*TIMER::ptr() }
.$timer_alarm .$timer_alarm
.write(|w| unsafe { w.bits(target_time) }); .write(|w| unsafe { w.bits(target_time) });
});
Ok(()) Ok(())
} }
} }