@@ -22,18 +22,19 @@ use crate::{
22
22
/// Instant type used by the Timer & Alarm methods.
23
23
pub type Instant = TimerInstantU64 < 1_000_000 > ;
24
24
25
- static ALARMS : AtomicU8 = AtomicU8 :: new ( 0x0F ) ;
26
- fn take_alarm ( mask : u8 ) -> bool {
25
+ static ALARMS_TIMER0 : AtomicU8 = AtomicU8 :: new ( 0x0F ) ;
26
+ static ALARMS_TIMER1 : AtomicU8 = AtomicU8 :: new ( 0x0F ) ;
27
+ fn take_alarm ( mask : u8 , alarms : & ' static AtomicU8 ) -> bool {
27
28
critical_section:: with ( |_| {
28
- let alarms = ALARMS . load ( Ordering :: Relaxed ) ;
29
- ALARMS . store ( alarms & !mask, Ordering :: Relaxed ) ;
30
- ( alarms & mask) != 0
29
+ let current_alarms = alarms . load ( Ordering :: Relaxed ) ;
30
+ alarms . store ( current_alarms & !mask, Ordering :: Relaxed ) ;
31
+ ( current_alarms & mask) != 0
31
32
} )
32
33
}
33
- fn release_alarm ( mask : u8 ) {
34
+ fn release_alarm ( mask : u8 , alarms : & ' static AtomicU8 ) {
34
35
critical_section:: with ( |_| {
35
- let alarms = ALARMS . load ( Ordering :: Relaxed ) ;
36
- ALARMS . store ( alarms | mask, Ordering :: Relaxed ) ;
36
+ let current_alarms = alarms . load ( Ordering :: Relaxed ) ;
37
+ alarms . store ( current_alarms | mask, Ordering :: Relaxed ) ;
37
38
} ) ;
38
39
}
39
40
@@ -66,6 +67,15 @@ pub trait TimerDevice: Sealed + Clone + Copy + 'static {
66
67
unsafe { & * pac:: TIMER1 :: ptr ( ) }
67
68
}
68
69
}
70
+
71
+ /// Get the static AtomicU8 for managing alarms.
72
+ fn get_alarms_tracker ( ) -> & ' static AtomicU8 {
73
+ if Self :: ID == 0 {
74
+ & ALARMS_TIMER0
75
+ } else {
76
+ & ALARMS_TIMER1
77
+ }
78
+ }
69
79
}
70
80
71
81
impl TimerDevice for CopyableTimer0 {
@@ -168,22 +178,22 @@ where
168
178
}
169
179
/// Retrieve a reference to alarm 0. Will only return a value the first time this is called
170
180
pub fn alarm_0 ( & mut self ) -> Option < Alarm0 < D > > {
171
- take_alarm ( 1 << 0 ) . then_some ( Alarm0 ( * self ) )
181
+ take_alarm ( 1 << 0 , < D > :: get_alarms_tracker ( ) ) . then_some ( Alarm0 ( * self ) )
172
182
}
173
183
174
184
/// Retrieve a reference to alarm 1. Will only return a value the first time this is called
175
185
pub fn alarm_1 ( & mut self ) -> Option < Alarm1 < D > > {
176
- take_alarm ( 1 << 1 ) . then_some ( Alarm1 ( * self ) )
186
+ take_alarm ( 1 << 1 , < D > :: get_alarms_tracker ( ) ) . then_some ( Alarm1 ( * self ) )
177
187
}
178
188
179
189
/// Retrieve a reference to alarm 2. Will only return a value the first time this is called
180
190
pub fn alarm_2 ( & mut self ) -> Option < Alarm2 < D > > {
181
- take_alarm ( 1 << 2 ) . then_some ( Alarm2 ( * self ) )
191
+ take_alarm ( 1 << 2 , < D > :: get_alarms_tracker ( ) ) . then_some ( Alarm2 ( * self ) )
182
192
}
183
193
184
194
/// Retrieve a reference to alarm 3. Will only return a value the first time this is called
185
195
pub fn alarm_3 ( & mut self ) -> Option < Alarm3 < D > > {
186
- take_alarm ( 1 << 3 ) . then_some ( Alarm3 ( * self ) )
196
+ take_alarm ( 1 << 3 , < D > :: get_alarms_tracker ( ) ) . then_some ( Alarm3 ( * self ) )
187
197
}
188
198
189
199
/// Pauses execution for at minimum `us` microseconds.
@@ -549,7 +559,7 @@ macro_rules! impl_alarm {
549
559
{
550
560
fn drop( & mut self ) {
551
561
self . disable_interrupt( ) ;
552
- release_alarm( $armed_bit_mask)
562
+ release_alarm( $armed_bit_mask, D :: get_alarms_tracker ( ) ) ;
553
563
}
554
564
}
555
565
} ;
@@ -636,4 +646,4 @@ pub mod monotonic {
636
646
637
647
unsafe fn reset ( & mut self ) { }
638
648
}
639
- }
649
+ }
0 commit comments