From 825d8c84553df12694dd965ea034d0afb8a34ee7 Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Mon, 30 Dec 2013 12:17:50 +0100 Subject: [PATCH] sam: Optimized delayMicroseconds() (Rob Tillaart) See #1121 --- build/shared/revisions.txt | 1 + hardware/arduino/sam/cores/arduino/wiring.h | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/build/shared/revisions.txt b/build/shared/revisions.txt index 66bb02f64..0e7c272f5 100644 --- a/build/shared/revisions.txt +++ b/build/shared/revisions.txt @@ -11,6 +11,7 @@ ARDUINO 1.5.6 BETA [core] * sam: Fixed wrap-around bug in delay() (Mark Tillotson) * sam: Fixed regression in analogRead() (fails to read multiple channels) (Mark Tillotson) +* sam: Optimized delayMicroseconds() (Rob Tillaart) #1121 * Optimized Print::print(String&) method, now uses internal string buffer to perform block write ARDUINO 1.5.5 BETA 2013.11.28 diff --git a/hardware/arduino/sam/cores/arduino/wiring.h b/hardware/arduino/sam/cores/arduino/wiring.h index 3c58cf06c..b3edbea42 100644 --- a/hardware/arduino/sam/cores/arduino/wiring.h +++ b/hardware/arduino/sam/cores/arduino/wiring.h @@ -64,11 +64,12 @@ extern void delay( uint32_t dwMs ) ; */ static inline void delayMicroseconds(uint32_t) __attribute__((always_inline, unused)); static inline void delayMicroseconds(uint32_t usec){ + if (usec == 0) return; uint32_t n = usec * (VARIANT_MCK / 3000000); asm volatile( "L_%=_delayMicroseconds:" "\n\t" "subs %0, #1" "\n\t" - "bge L_%=_delayMicroseconds" "\n" + "bne L_%=_delayMicroseconds" "\n" : "+r" (n) : ); }