From 9d7ca3e4057f12334904a727c6f5177a3df43aa3 Mon Sep 17 00:00:00 2001 From: Russ Butler Date: Thu, 9 Jun 2016 17:09:29 +0100 Subject: [PATCH] KSDK2 - restore interrupts in InstallIRQHandler Restore the state of interrupts inside InstallIRQHandler rather than leaving them enabled. --- .../TARGET_KSDK2_MCUS/TARGET_K22F/drivers/fsl_common.c | 6 +++++- .../TARGET_KSDK2_MCUS/TARGET_K64F/drivers/fsl_common.c | 6 +++++- .../TARGET_KSDK2_MCUS/TARGET_KL27Z/drivers/fsl_common.c | 6 +++++- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/hal/targets/hal/TARGET_Freescale/TARGET_KSDK2_MCUS/TARGET_K22F/drivers/fsl_common.c b/hal/targets/hal/TARGET_Freescale/TARGET_KSDK2_MCUS/TARGET_K22F/drivers/fsl_common.c index 895bbb04a00..9e21f7594d0 100755 --- a/hal/targets/hal/TARGET_Freescale/TARGET_KSDK2_MCUS/TARGET_K22F/drivers/fsl_common.c +++ b/hal/targets/hal/TARGET_Freescale/TARGET_KSDK2_MCUS/TARGET_K22F/drivers/fsl_common.c @@ -77,7 +77,9 @@ void InstallIRQHandler(IRQn_Type irq, uint32_t irqHandler) uint32_t __RAM_VECTOR_TABLE_SIZE = (uint32_t)(__RAM_VECTOR_TABLE_SIZE_BYTES); #endif /* defined(__CC_ARM) */ uint32_t n; + uint32_t interrupts_disabled; + interrupts_disabled = __get_PRIMASK(); __disable_irq(); if (SCB->VTOR != (uint32_t)__VECTOR_RAM) { @@ -93,5 +95,7 @@ void InstallIRQHandler(IRQn_Type irq, uint32_t irqHandler) /* make sure the __VECTOR_RAM is noncachable */ __VECTOR_RAM[irq + 16] = irqHandler; - __enable_irq(); + if (!interrupts_disabled) { + __enable_irq(); + } } diff --git a/hal/targets/hal/TARGET_Freescale/TARGET_KSDK2_MCUS/TARGET_K64F/drivers/fsl_common.c b/hal/targets/hal/TARGET_Freescale/TARGET_KSDK2_MCUS/TARGET_K64F/drivers/fsl_common.c index 895bbb04a00..9e21f7594d0 100755 --- a/hal/targets/hal/TARGET_Freescale/TARGET_KSDK2_MCUS/TARGET_K64F/drivers/fsl_common.c +++ b/hal/targets/hal/TARGET_Freescale/TARGET_KSDK2_MCUS/TARGET_K64F/drivers/fsl_common.c @@ -77,7 +77,9 @@ void InstallIRQHandler(IRQn_Type irq, uint32_t irqHandler) uint32_t __RAM_VECTOR_TABLE_SIZE = (uint32_t)(__RAM_VECTOR_TABLE_SIZE_BYTES); #endif /* defined(__CC_ARM) */ uint32_t n; + uint32_t interrupts_disabled; + interrupts_disabled = __get_PRIMASK(); __disable_irq(); if (SCB->VTOR != (uint32_t)__VECTOR_RAM) { @@ -93,5 +95,7 @@ void InstallIRQHandler(IRQn_Type irq, uint32_t irqHandler) /* make sure the __VECTOR_RAM is noncachable */ __VECTOR_RAM[irq + 16] = irqHandler; - __enable_irq(); + if (!interrupts_disabled) { + __enable_irq(); + } } diff --git a/hal/targets/hal/TARGET_Freescale/TARGET_KSDK2_MCUS/TARGET_KL27Z/drivers/fsl_common.c b/hal/targets/hal/TARGET_Freescale/TARGET_KSDK2_MCUS/TARGET_KL27Z/drivers/fsl_common.c index 895bbb04a00..9e21f7594d0 100755 --- a/hal/targets/hal/TARGET_Freescale/TARGET_KSDK2_MCUS/TARGET_KL27Z/drivers/fsl_common.c +++ b/hal/targets/hal/TARGET_Freescale/TARGET_KSDK2_MCUS/TARGET_KL27Z/drivers/fsl_common.c @@ -77,7 +77,9 @@ void InstallIRQHandler(IRQn_Type irq, uint32_t irqHandler) uint32_t __RAM_VECTOR_TABLE_SIZE = (uint32_t)(__RAM_VECTOR_TABLE_SIZE_BYTES); #endif /* defined(__CC_ARM) */ uint32_t n; + uint32_t interrupts_disabled; + interrupts_disabled = __get_PRIMASK(); __disable_irq(); if (SCB->VTOR != (uint32_t)__VECTOR_RAM) { @@ -93,5 +95,7 @@ void InstallIRQHandler(IRQn_Type irq, uint32_t irqHandler) /* make sure the __VECTOR_RAM is noncachable */ __VECTOR_RAM[irq + 16] = irqHandler; - __enable_irq(); + if (!interrupts_disabled) { + __enable_irq(); + } }