From 6ebca5756c4204bbb8f5205c9accc66f2aa65ed1 Mon Sep 17 00:00:00 2001 From: Giovanni Di Sirio Date: Mon, 25 Apr 2016 13:52:55 +0000 Subject: Moved VTOS initialization in startup files. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@9364 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- os/common/ports/ARMCMx/chcore_v7m.h | 10 ---------- os/common/startup/ARMCMx/compilers/GCC/crt0_v6m.S | 17 +++++++++++++++++ os/common/startup/ARMCMx/compilers/GCC/crt0_v7m.S | 16 ++++++++++++++++ 3 files changed, 33 insertions(+), 10 deletions(-) (limited to 'os') diff --git a/os/common/ports/ARMCMx/chcore_v7m.h b/os/common/ports/ARMCMx/chcore_v7m.h index 668d9e3b0..7a04d1f81 100644 --- a/os/common/ports/ARMCMx/chcore_v7m.h +++ b/os/common/ports/ARMCMx/chcore_v7m.h @@ -150,13 +150,6 @@ #error "invalid priority level specified for CORTEX_PRIORITY_SVCALL" #endif -/** - * @brief NVIC VTOR initialization expression. - */ -#if !defined(CORTEX_VTOR_INIT) || defined(__DOXYGEN__) -#define CORTEX_VTOR_INIT 0x00000000U -#endif - /** * @brief NVIC PRIGROUP initialization expression. * @details The default assigns all available priority bits as preemption @@ -512,9 +505,6 @@ extern "C" { */ static inline void port_init(void) { - /* Initialization of the vector table and priority related settings.*/ - SCB->VTOR = CORTEX_VTOR_INIT; - /* Initializing priority grouping.*/ NVIC_SetPriorityGrouping(CORTEX_PRIGROUP_INIT); diff --git a/os/common/startup/ARMCMx/compilers/GCC/crt0_v6m.S b/os/common/startup/ARMCMx/compilers/GCC/crt0_v6m.S index b313b611a..643783bc8 100644 --- a/os/common/startup/ARMCMx/compilers/GCC/crt0_v6m.S +++ b/os/common/startup/ARMCMx/compilers/GCC/crt0_v6m.S @@ -39,10 +39,21 @@ #define CONTROL_USE_MSP 0 #define CONTROL_USE_PSP 2 +#define SCB_VTOR 0xE000ED08 + /*===========================================================================*/ /* Module pre-compile time settings. */ /*===========================================================================*/ +/** + * @brief VTOR special register initialization. + * @details VTOR is initialized to point to the vectors table. + * @note This option can only be enabled on Cortex-M0+ cores. + */ +#if !defined(CRT0_VTOR_INIT) || defined(__DOXYGEN__) +#define CRT0_VTOR_INIT FALSE +#endif + /** * @brief Control special register initialization value. * @details The system is setup to run in privileged mode using the PSP @@ -140,6 +151,12 @@ Reset_Handler: msr CONTROL, r0 isb +#if CRT0_VTOR_INIT == TRUE + ldr r0, =_vectors + ldr r1, =SCB_VTOR + str r0, [r1] +#endif + #if CRT0_INIT_CORE == TRUE /* Core initialization.*/ bl __core_init diff --git a/os/common/startup/ARMCMx/compilers/GCC/crt0_v7m.S b/os/common/startup/ARMCMx/compilers/GCC/crt0_v7m.S index 5f9668efb..3abfc1813 100644 --- a/os/common/startup/ARMCMx/compilers/GCC/crt0_v7m.S +++ b/os/common/startup/ARMCMx/compilers/GCC/crt0_v7m.S @@ -43,6 +43,7 @@ #define FPCCR_ASPEN (1 << 31) #define FPCCR_LSPEN (1 << 30) +#define SCB_VTOR 0xE000ED08 #define SCB_CPACR 0xE000ED88 #define SCB_FPCCR 0xE000EF34 #define SCB_FPDSCR 0xE000EF3C @@ -51,6 +52,14 @@ /* Module pre-compile time settings. */ /*===========================================================================*/ +/** + * @brief VTOR special register initialization. + * @details VTOR is initialized to point to the vectors table. + */ +#if !defined(CRT0_VTOR_INIT) || defined(__DOXYGEN__) +#define CRT0_VTOR_INIT TRUE +#endif + /** * @brief FPU initialization switch. */ @@ -175,6 +184,13 @@ Reset_Handler: ldr r0, =__process_stack_end__ msr PSP, r0 +#if CRT0_VTOR_INIT == TRUE + ldr r0, =_vectors + movw r1, #SCB_VTOR & 0xFFFF + movt r1, #SCB_VTOR >> 16 + str r0, [r1] +#endif + #if CRT0_INIT_FPU == TRUE /* FPU FPCCR initialization.*/ movw r0, #CRT0_FPCCR_INIT & 0xFFFF -- cgit v1.2.3