11//! Delays.
22
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+
38/// Delay with up to nanosecond precision.
49pub trait DelayNs {
510 /// Pauses execution for at minimum `ns` nanoseconds. Pause can be longer
@@ -9,22 +14,30 @@ pub trait DelayNs {
914 /// Pauses execution for at minimum `us` microseconds. Pause can be longer
1015 /// if the implementation requires it due to precision/timing issues.
1116 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 ) ;
1523 }
16- self . delay_ns ( us * 1_000 ) ;
24+
25+ self . delay_ns ( us * NANOS_PER_MICRO ) ;
1726 }
1827
1928 /// Pauses execution for at minimum `ms` milliseconds. Pause can be longer
2029 /// if the implementation requires it due to precision/timing issues.
2130 #[ inline]
2231 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 ) ;
2638 }
27- self . delay_ns ( ms * 1_000_000 ) ;
39+
40+ self . delay_ns ( ms * NANOS_PER_MILLI ) ;
2841 }
2942}
3043
0 commit comments