From: rtel Date: Sun, 15 Jun 2014 09:24:08 +0000 (+0000) Subject: Add code to assert() if non ISR safe API function is called from ISR in Tasking CM4F... X-Git-Tag: V8.1.0~30 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=bdb98e3caa97f572688d14ae4b570e206f4cc4f7;p=freertos Add code to assert() if non ISR safe API function is called from ISR in Tasking CM4F ports - plus fix bug where the max syscall interrupt priority was used incorrectly in the Tasking CM4F port. git-svn-id: https://svn.code.sf.net/p/freertos/code/trunk@2262 1d2547de-c912-0410-9cb9-b8ca96c0e9e2 --- diff --git a/FreeRTOS/Source/portable/Tasking/ARM_CM4F/port.c b/FreeRTOS/Source/portable/Tasking/ARM_CM4F/port.c index 1fe11a20a..44e0b8752 100644 --- a/FreeRTOS/Source/portable/Tasking/ARM_CM4F/port.c +++ b/FreeRTOS/Source/portable/Tasking/ARM_CM4F/port.c @@ -81,6 +81,9 @@ #define portNVIC_PENDSV_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16 ) #define portNVIC_SYSTICK_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24 ) +/* Masks off all bits but the VECTACTIVE bits in the ICSR register. */ +#define portVECTACTIVE_MASK ( 0x1FUL ) + /* Constants required to manipulate the VFP. */ #define portFPCCR ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating point context control register. */ #define portASPEN_AND_LSPEN_BITS ( 0x3UL << 30UL ) @@ -240,6 +243,16 @@ void vPortEnterCritical( void ) ulCriticalNesting++; __DSB(); __ISB(); + + /* This is not the interrupt safe version of the enter critical function so + assert() if it is being called from an interrupt context. Only API + functions that end in "FromISR" can be used in an interrupt. Only assert if + the critical nesting count is 1 to protect against recursive calls if the + assert function also uses a critical section. */ + if( ulCriticalNesting == 1 ) + { + configASSERT( ( ( *(portNVIC_INT_CTRL) ) & portVECTACTIVE_MASK ) == 0 ); + } } /*-----------------------------------------------------------*/ diff --git a/FreeRTOS/Source/portable/Tasking/ARM_CM4F/port_asm.asm b/FreeRTOS/Source/portable/Tasking/ARM_CM4F/port_asm.asm index fc6057e80..b4ff5d124 100644 --- a/FreeRTOS/Source/portable/Tasking/ARM_CM4F/port_asm.asm +++ b/FreeRTOS/Source/portable/Tasking/ARM_CM4F/port_asm.asm @@ -92,6 +92,7 @@ _vector_14: .type func stmdb sp!, {r3} ldr.w r0, =ulMaxSyscallInterruptPriorityConst + ldr r0, [r0] msr basepri, r0 bl vTaskSwitchContext mov r0, #0 @@ -146,6 +147,7 @@ _lc_ref__vector_pp_14: .type func stmdb sp!, {r3} ldr.w r0, =ulMaxSyscallInterruptPriorityConst + ldr r0, [r0] msr basepri, r0 bl vTaskSwitchContext mov r0, #0 @@ -206,6 +208,7 @@ vPortStartFirstTask .type func msr msp, r0 ;Call SVC to start the first task. cpsie i + cpsie f dsb isb svc 0 @@ -237,6 +240,7 @@ vPortEnableVFP .type func ulPortSetInterruptMask: mrs r0, basepri ldr.w r1, =ulMaxSyscallInterruptPriorityConst + ldr r1, [r1] msr basepri, r1 bx r14 .size ulPortSetInterruptMask, $-ulPortSetInterruptMask