diff options
-rw-r--r-- | asm/inline.rs | 9 | ||||
-rw-r--r-- | bin/thumbv6m-none-eabi-lto.a | bin | 16012 -> 16072 bytes | |||
-rw-r--r-- | bin/thumbv6m-none-eabi.a | bin | 18848 -> 19032 bytes | |||
-rw-r--r-- | bin/thumbv7em-none-eabi-lto.a | bin | 20120 -> 20192 bytes | |||
-rw-r--r-- | bin/thumbv7em-none-eabi.a | bin | 23280 -> 23464 bytes | |||
-rw-r--r-- | bin/thumbv7em-none-eabihf-lto.a | bin | 20988 -> 21096 bytes | |||
-rw-r--r-- | bin/thumbv7em-none-eabihf.a | bin | 24368 -> 24552 bytes | |||
-rw-r--r-- | bin/thumbv7m-none-eabi-lto.a | bin | 18916 -> 18980 bytes | |||
-rw-r--r-- | bin/thumbv7m-none-eabi.a | bin | 22112 -> 22300 bytes | |||
-rw-r--r-- | bin/thumbv8m.base-none-eabi-lto.a | bin | 19296 -> 19364 bytes | |||
-rw-r--r-- | bin/thumbv8m.base-none-eabi.a | bin | 22548 -> 22736 bytes | |||
-rw-r--r-- | bin/thumbv8m.main-none-eabi-lto.a | bin | 23624 -> 23760 bytes | |||
-rw-r--r-- | bin/thumbv8m.main-none-eabi.a | bin | 27936 -> 28124 bytes | |||
-rw-r--r-- | bin/thumbv8m.main-none-eabihf-lto.a | bin | 24520 -> 24600 bytes | |||
-rw-r--r-- | bin/thumbv8m.main-none-eabihf.a | bin | 28984 -> 29176 bytes | |||
-rw-r--r-- | src/asm.rs | 8 |
16 files changed, 9 insertions, 8 deletions
diff --git a/asm/inline.rs b/asm/inline.rs index 9150c9c..5e2fbc1 100644 --- a/asm/inline.rs +++ b/asm/inline.rs @@ -52,13 +52,16 @@ pub unsafe fn __cpsie() { #[inline(always)] pub unsafe fn __delay(cyc: u32) { - // Use local labels to avoid R_ARM_THM_JUMP8 relocations which fail on thumbv6m. + // The loop will normally take 3 to 4 CPU cycles per iteration, but superscalar cores + // (eg. Cortex-M7) can potentially do it in 2, so we use that as the lower bound, since delaying + // for more cycles is okay. + let real_cyc = cyc / 2; asm!( + // Use local labels to avoid R_ARM_THM_JUMP8 relocations which fail on thumbv6m. "1:", - "nop", "subs {}, #1", "bne 1b", - in(reg) cyc + in(reg) real_cyc ); } diff --git a/bin/thumbv6m-none-eabi-lto.a b/bin/thumbv6m-none-eabi-lto.a Binary files differindex 1b0e77a..70b4f3f 100644 --- a/bin/thumbv6m-none-eabi-lto.a +++ b/bin/thumbv6m-none-eabi-lto.a diff --git a/bin/thumbv6m-none-eabi.a b/bin/thumbv6m-none-eabi.a Binary files differindex 6835c5b..6b66561 100644 --- a/bin/thumbv6m-none-eabi.a +++ b/bin/thumbv6m-none-eabi.a diff --git a/bin/thumbv7em-none-eabi-lto.a b/bin/thumbv7em-none-eabi-lto.a Binary files differindex 0a42c47..b2ae124 100644 --- a/bin/thumbv7em-none-eabi-lto.a +++ b/bin/thumbv7em-none-eabi-lto.a diff --git a/bin/thumbv7em-none-eabi.a b/bin/thumbv7em-none-eabi.a Binary files differindex aeef3ab..e414f39 100644 --- a/bin/thumbv7em-none-eabi.a +++ b/bin/thumbv7em-none-eabi.a diff --git a/bin/thumbv7em-none-eabihf-lto.a b/bin/thumbv7em-none-eabihf-lto.a Binary files differindex 6d5e7cf..073bfeb 100644 --- a/bin/thumbv7em-none-eabihf-lto.a +++ b/bin/thumbv7em-none-eabihf-lto.a diff --git a/bin/thumbv7em-none-eabihf.a b/bin/thumbv7em-none-eabihf.a Binary files differindex dd4f80d..c13d9a7 100644 --- a/bin/thumbv7em-none-eabihf.a +++ b/bin/thumbv7em-none-eabihf.a diff --git a/bin/thumbv7m-none-eabi-lto.a b/bin/thumbv7m-none-eabi-lto.a Binary files differindex 66b6be3..a3fcb49 100644 --- a/bin/thumbv7m-none-eabi-lto.a +++ b/bin/thumbv7m-none-eabi-lto.a diff --git a/bin/thumbv7m-none-eabi.a b/bin/thumbv7m-none-eabi.a Binary files differindex cdae52f..ce8057d 100644 --- a/bin/thumbv7m-none-eabi.a +++ b/bin/thumbv7m-none-eabi.a diff --git a/bin/thumbv8m.base-none-eabi-lto.a b/bin/thumbv8m.base-none-eabi-lto.a Binary files differindex 59c6510..ff66b5a 100644 --- a/bin/thumbv8m.base-none-eabi-lto.a +++ b/bin/thumbv8m.base-none-eabi-lto.a diff --git a/bin/thumbv8m.base-none-eabi.a b/bin/thumbv8m.base-none-eabi.a Binary files differindex a300490..a5418d8 100644 --- a/bin/thumbv8m.base-none-eabi.a +++ b/bin/thumbv8m.base-none-eabi.a diff --git a/bin/thumbv8m.main-none-eabi-lto.a b/bin/thumbv8m.main-none-eabi-lto.a Binary files differindex 4306526..5b92a95 100644 --- a/bin/thumbv8m.main-none-eabi-lto.a +++ b/bin/thumbv8m.main-none-eabi-lto.a diff --git a/bin/thumbv8m.main-none-eabi.a b/bin/thumbv8m.main-none-eabi.a Binary files differindex 5f0b282..035c821 100644 --- a/bin/thumbv8m.main-none-eabi.a +++ b/bin/thumbv8m.main-none-eabi.a diff --git a/bin/thumbv8m.main-none-eabihf-lto.a b/bin/thumbv8m.main-none-eabihf-lto.a Binary files differindex cc62761..30c6ccc 100644 --- a/bin/thumbv8m.main-none-eabihf-lto.a +++ b/bin/thumbv8m.main-none-eabihf-lto.a diff --git a/bin/thumbv8m.main-none-eabihf.a b/bin/thumbv8m.main-none-eabihf.a Binary files differindex cd688ac..9f6241e 100644 --- a/bin/thumbv8m.main-none-eabihf.a +++ b/bin/thumbv8m.main-none-eabihf.a @@ -15,7 +15,7 @@ pub fn bkpt() { call_asm!(__bkpt()); } -/// Blocks the program for *at least* `n` instruction cycles +/// Blocks the program for *at least* `cycles` CPU cycles. /// /// This is implemented in assembly so its execution time is independent of the optimization /// level, however it is dependent on the specific architecture and core configuration. @@ -25,10 +25,8 @@ pub fn bkpt() { /// timer-less initialization of peripherals if and only if accurate timing is not essential. In /// any other case please use a more accurate method to produce a delay. #[inline] -pub fn delay(n: u32) { - // NOTE(divide by 4) is easier to compute than `/ 3` because it's just a shift (`>> 2`). - let real_cyc = n / 4 + 1; - call_asm!(__delay(real_cyc: u32)); +pub fn delay(cycles: u32) { + call_asm!(__delay(cycles: u32)); } /// A no-operation. Useful to prevent delay loops from being optimized away. |