mirror of https://github.com/ARMmbed/mbed-os.git
Assembly based loop for timing test
parent
3df42bcfb4
commit
562a548053
|
|
@ -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();
|
||||
|
|
|
|||
Loading…
Reference in New Issue