From ad984bef9a7d5ca01b97eb8b14a655e64ea79cc9 Mon Sep 17 00:00:00 2001 From: arighi Date: Tue, 6 Apr 2010 09:28:16 +0000 Subject: [PATCH] lm3s1968: make __delay() naked and usable outside the clock module. In this way we're sure __delay() won't be inlined nor optimized by the compiler and it can be used suitably as a simple spinning delay. git-svn-id: https://src.develer.com/svnoss/bertos/trunk@3391 38d2e660-2303-0410-9eaa-f027e97ec537 --- bertos/cpu/cortex-m3/drv/clock_lm3s.c | 13 +++++++++---- bertos/cpu/cortex-m3/drv/clock_lm3s.h | 2 ++ 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/bertos/cpu/cortex-m3/drv/clock_lm3s.c b/bertos/cpu/cortex-m3/drv/clock_lm3s.c index 8790b0e6..1c643b58 100644 --- a/bertos/cpu/cortex-m3/drv/clock_lm3s.c +++ b/bertos/cpu/cortex-m3/drv/clock_lm3s.c @@ -51,12 +51,15 @@ /* * Very small delay: each loop takes 3 cycles. */ -INLINE void __delay(unsigned long iterations) +void NAKED __delay(unsigned long iterations) { + register uint32_t __n asm("r0") = iterations; + asm volatile ( - "1: subs %0, #1\n\t" - " bne 1b\n\t" - : "=r"(iterations) : : "memory", "cc"); + "1: subs r0, #1\n\t" + "bne 1b\n\t" + "bx lr\n\t" + : : "r"(__n) : "memory", "cc"); } unsigned long clock_get_rate(void) @@ -110,6 +113,8 @@ void clock_set_rate(void) HWREG(SYSCTL_RCC) = rcc; HWREG(SYSCTL_RCC) = rcc2; + __delay(16); + /* * Step #2: select the crystal value (XTAL) and oscillator source * (OSCSRC), and clear the PWRDN bit in RCC/RCC2. Setting the XTAL diff --git a/bertos/cpu/cortex-m3/drv/clock_lm3s.h b/bertos/cpu/cortex-m3/drv/clock_lm3s.h index d4322cc2..03940184 100644 --- a/bertos/cpu/cortex-m3/drv/clock_lm3s.h +++ b/bertos/cpu/cortex-m3/drv/clock_lm3s.h @@ -41,6 +41,8 @@ /* Crystal frequency attached to the main oscillator. */ #define XTAL_FREQ SYSCTL_RCC_XTAL_8MHZ +extern void __delay(unsigned long iterations); + unsigned long clock_get_rate(void); void clock_set_rate(void); -- 2.25.1