From 562a5480532bb98f71bcf5b2666ec46d506626a0 Mon Sep 17 00:00:00 2001 From: Chris Date: Fri, 30 Jun 2017 20:33:58 +0100 Subject: [PATCH] Assembly based loop for timing test --- .../mbed_hal/flash/functional_tests/main.cpp | 46 +++++++++++++++++-- 1 file changed, 43 insertions(+), 3 deletions(-) diff --git a/TESTS/mbed_hal/flash/functional_tests/main.cpp b/TESTS/mbed_hal/flash/functional_tests/main.cpp index 1c933ecdd1..579995ed8c 100644 --- a/TESTS/mbed_hal/flash/functional_tests/main.cpp +++ b/TESTS/mbed_hal/flash/functional_tests/main.cpp @@ -52,8 +52,49 @@ static void erase_range(flash_t *flash, uint32_t addr, uint32_t size) size = size > sector_size ? size - sector_size : 0; } } +#ifdef __CC_ARM +MBED_NOINLINE +__asm static void delay_loop(uint32_t count) +{ +1 + SUBS a1, a1, #1 + BCS %BT1 + BX lr +} +#elif defined (__ICCARM__) +MBED_NOINLINE +static void delay_loop(uint32_t count) +{ + __asm volatile( + "loop: \n" + " SUBS %0, %0, #1 \n" + " BCS.n loop\n" + : "+r" (count) + : + : "cc" + ); +} +#else // GCC +MBED_NOINLINE +static void delay_loop(uint32_t count) +{ + __asm__ volatile ( + "%=:\n\t" +#if defined(__thumb__) && !defined(__thumb2__) + "SUB %0, #1\n\t" +#else + "SUBS %0, %0, #1\n\t" +#endif + "BCS %=b\n\t" + : "+l" (count) + : + : "cc" + ); +} +#endif -__attribute__((noinline)) static int time_cpu_cycles(uint32_t cycles) +MBED_NOINLINE +static int time_cpu_cycles(uint32_t cycles) { Timer timer; timer.start(); @@ -61,8 +102,7 @@ __attribute__((noinline)) static int time_cpu_cycles(uint32_t cycles) int timer_start = timer.read_us(); volatile uint32_t delay = (volatile uint32_t)cycles; - while (delay--); - + delay_loop(delay); int timer_end = timer.read_us(); timer.stop();