aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/inline.rs9
-rw-r--r--bin/thumbv6m-none-eabi-lto.abin16012 -> 16072 bytes
-rw-r--r--bin/thumbv6m-none-eabi.abin18848 -> 19032 bytes
-rw-r--r--bin/thumbv7em-none-eabi-lto.abin20120 -> 20192 bytes
-rw-r--r--bin/thumbv7em-none-eabi.abin23280 -> 23464 bytes
-rw-r--r--bin/thumbv7em-none-eabihf-lto.abin20988 -> 21096 bytes
-rw-r--r--bin/thumbv7em-none-eabihf.abin24368 -> 24552 bytes
-rw-r--r--bin/thumbv7m-none-eabi-lto.abin18916 -> 18980 bytes
-rw-r--r--bin/thumbv7m-none-eabi.abin22112 -> 22300 bytes
-rw-r--r--bin/thumbv8m.base-none-eabi-lto.abin19296 -> 19364 bytes
-rw-r--r--bin/thumbv8m.base-none-eabi.abin22548 -> 22736 bytes
-rw-r--r--bin/thumbv8m.main-none-eabi-lto.abin23624 -> 23760 bytes
-rw-r--r--bin/thumbv8m.main-none-eabi.abin27936 -> 28124 bytes
-rw-r--r--bin/thumbv8m.main-none-eabihf-lto.abin24520 -> 24600 bytes
-rw-r--r--bin/thumbv8m.main-none-eabihf.abin28984 -> 29176 bytes
-rw-r--r--src/asm.rs8
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
index 1b0e77a..70b4f3f 100644
--- a/bin/thumbv6m-none-eabi-lto.a
+++ b/bin/thumbv6m-none-eabi-lto.a
Binary files differ
diff --git a/bin/thumbv6m-none-eabi.a b/bin/thumbv6m-none-eabi.a
index 6835c5b..6b66561 100644
--- a/bin/thumbv6m-none-eabi.a
+++ b/bin/thumbv6m-none-eabi.a
Binary files differ
diff --git a/bin/thumbv7em-none-eabi-lto.a b/bin/thumbv7em-none-eabi-lto.a
index 0a42c47..b2ae124 100644
--- a/bin/thumbv7em-none-eabi-lto.a
+++ b/bin/thumbv7em-none-eabi-lto.a
Binary files differ
diff --git a/bin/thumbv7em-none-eabi.a b/bin/thumbv7em-none-eabi.a
index aeef3ab..e414f39 100644
--- a/bin/thumbv7em-none-eabi.a
+++ b/bin/thumbv7em-none-eabi.a
Binary files differ
diff --git a/bin/thumbv7em-none-eabihf-lto.a b/bin/thumbv7em-none-eabihf-lto.a
index 6d5e7cf..073bfeb 100644
--- a/bin/thumbv7em-none-eabihf-lto.a
+++ b/bin/thumbv7em-none-eabihf-lto.a
Binary files differ
diff --git a/bin/thumbv7em-none-eabihf.a b/bin/thumbv7em-none-eabihf.a
index dd4f80d..c13d9a7 100644
--- a/bin/thumbv7em-none-eabihf.a
+++ b/bin/thumbv7em-none-eabihf.a
Binary files differ
diff --git a/bin/thumbv7m-none-eabi-lto.a b/bin/thumbv7m-none-eabi-lto.a
index 66b6be3..a3fcb49 100644
--- a/bin/thumbv7m-none-eabi-lto.a
+++ b/bin/thumbv7m-none-eabi-lto.a
Binary files differ
diff --git a/bin/thumbv7m-none-eabi.a b/bin/thumbv7m-none-eabi.a
index cdae52f..ce8057d 100644
--- a/bin/thumbv7m-none-eabi.a
+++ b/bin/thumbv7m-none-eabi.a
Binary files differ
diff --git a/bin/thumbv8m.base-none-eabi-lto.a b/bin/thumbv8m.base-none-eabi-lto.a
index 59c6510..ff66b5a 100644
--- a/bin/thumbv8m.base-none-eabi-lto.a
+++ b/bin/thumbv8m.base-none-eabi-lto.a
Binary files differ
diff --git a/bin/thumbv8m.base-none-eabi.a b/bin/thumbv8m.base-none-eabi.a
index a300490..a5418d8 100644
--- a/bin/thumbv8m.base-none-eabi.a
+++ b/bin/thumbv8m.base-none-eabi.a
Binary files differ
diff --git a/bin/thumbv8m.main-none-eabi-lto.a b/bin/thumbv8m.main-none-eabi-lto.a
index 4306526..5b92a95 100644
--- a/bin/thumbv8m.main-none-eabi-lto.a
+++ b/bin/thumbv8m.main-none-eabi-lto.a
Binary files differ
diff --git a/bin/thumbv8m.main-none-eabi.a b/bin/thumbv8m.main-none-eabi.a
index 5f0b282..035c821 100644
--- a/bin/thumbv8m.main-none-eabi.a
+++ b/bin/thumbv8m.main-none-eabi.a
Binary files differ
diff --git a/bin/thumbv8m.main-none-eabihf-lto.a b/bin/thumbv8m.main-none-eabihf-lto.a
index cc62761..30c6ccc 100644
--- a/bin/thumbv8m.main-none-eabihf-lto.a
+++ b/bin/thumbv8m.main-none-eabihf-lto.a
Binary files differ
diff --git a/bin/thumbv8m.main-none-eabihf.a b/bin/thumbv8m.main-none-eabihf.a
index cd688ac..9f6241e 100644
--- a/bin/thumbv8m.main-none-eabihf.a
+++ b/bin/thumbv8m.main-none-eabihf.a
Binary files differ
diff --git a/src/asm.rs b/src/asm.rs
index 297198b..4dc1ab0 100644
--- a/src/asm.rs
+++ b/src/asm.rs
@@ -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.