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) : ); }