1
1
//! Delays.
2
2
3
+ /// Nanoseconds per microsecond
4
+ const NANOS_PER_MICRO : u32 = 1_000 ;
5
+ /// Nanoseconds per millisecond
6
+ const NANOS_PER_MILLI : u32 = 1_000_000 ;
7
+
3
8
/// Delay with up to nanosecond precision.
4
9
pub trait DelayNs {
5
10
/// Pauses execution for at minimum `ns` nanoseconds. Pause can be longer
@@ -9,22 +14,30 @@ pub trait DelayNs {
9
14
/// Pauses execution for at minimum `us` microseconds. Pause can be longer
10
15
/// if the implementation requires it due to precision/timing issues.
11
16
fn delay_us ( & mut self , mut us : u32 ) {
12
- while us > 4_294_967 {
13
- us -= 4_294_967 ;
14
- self . delay_ns ( 4_294_967_000 ) ;
17
+ const MAX_MICROS : u32 = u32:: MAX / NANOS_PER_MICRO ;
18
+
19
+ // Avoid potential overflow if micro -> nano conversion is too large
20
+ while us > MAX_MICROS {
21
+ us -= MAX_MICROS ;
22
+ self . delay_ns ( MAX_MICROS * NANOS_PER_MICRO ) ;
15
23
}
16
- self . delay_ns ( us * 1_000 ) ;
24
+
25
+ self . delay_ns ( us * NANOS_PER_MICRO ) ;
17
26
}
18
27
19
28
/// Pauses execution for at minimum `ms` milliseconds. Pause can be longer
20
29
/// if the implementation requires it due to precision/timing issues.
21
30
#[ inline]
22
31
fn delay_ms ( & mut self , mut ms : u32 ) {
23
- while ms > 4294 {
24
- ms -= 4294 ;
25
- self . delay_ns ( 4_294_000_000 ) ;
32
+ const MAX_MILLIS : u32 = u32:: MAX / NANOS_PER_MILLI ;
33
+
34
+ // Avoid potential overflow if milli -> nano conversion is too large
35
+ while ms > MAX_MILLIS {
36
+ ms -= MAX_MILLIS ;
37
+ self . delay_ns ( MAX_MILLIS * NANOS_PER_MILLI ) ;
26
38
}
27
- self . delay_ns ( ms * 1_000_000 ) ;
39
+
40
+ self . delay_ns ( ms * NANOS_PER_MILLI ) ;
28
41
}
29
42
}
30
43
0 commit comments