]> git.sur5r.net Git - freertos/commitdiff
Add code to assert() if non ISR safe API function is called from ISR in Tasking CM4F...
authorrtel <rtel@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Sun, 15 Jun 2014 09:24:08 +0000 (09:24 +0000)
committerrtel <rtel@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Sun, 15 Jun 2014 09:24:08 +0000 (09:24 +0000)
git-svn-id: https://svn.code.sf.net/p/freertos/code/trunk@2262 1d2547de-c912-0410-9cb9-b8ca96c0e9e2

FreeRTOS/Source/portable/Tasking/ARM_CM4F/port.c
FreeRTOS/Source/portable/Tasking/ARM_CM4F/port_asm.asm

index 1fe11a20a19cdfa75c6e6ab092bec4ed6a864dc4..44e0b87521c7fea55915d3aae1ddd6fd2dccea5b 100644 (file)
@@ -81,6 +81,9 @@
 #define portNVIC_PENDSV_PRI                    ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16 )\r
 #define portNVIC_SYSTICK_PRI           ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24 )\r
 \r
+/* Masks off all bits but the VECTACTIVE bits in the ICSR register. */\r
+#define portVECTACTIVE_MASK                                    ( 0x1FUL )\r
+\r
 /* Constants required to manipulate the VFP. */\r
 #define portFPCCR                                      ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating point context control register. */\r
 #define portASPEN_AND_LSPEN_BITS       ( 0x3UL << 30UL )\r
@@ -240,6 +243,16 @@ void vPortEnterCritical( void )
        ulCriticalNesting++;\r
        __DSB();\r
        __ISB();\r
+\r
+       /* This is not the interrupt safe version of the enter critical function so\r
+       assert() if it is being called from an interrupt context.  Only API\r
+       functions that end in "FromISR" can be used in an interrupt.  Only assert if\r
+       the critical nesting count is 1 to protect against recursive calls if the\r
+       assert function also uses a critical section. */\r
+       if( ulCriticalNesting == 1 )\r
+       {\r
+               configASSERT( ( ( *(portNVIC_INT_CTRL) ) & portVECTACTIVE_MASK ) == 0 );\r
+       }\r
 }\r
 /*-----------------------------------------------------------*/\r
 \r
index fc6057e8073578a7772f99247e44eda6478feb3c..b4ff5d124ae1e22f5ade62bbe9057b3c242b47ba 100644 (file)
@@ -92,6 +92,7 @@ _vector_14: .type func
 \r
        stmdb sp!, {r3}\r
        ldr.w r0, =ulMaxSyscallInterruptPriorityConst\r
+       ldr r0, [r0]\r
        msr basepri, r0\r
        bl vTaskSwitchContext\r
        mov r0, #0\r
@@ -146,6 +147,7 @@ _lc_ref__vector_pp_14: .type func
 \r
        stmdb sp!, {r3}\r
        ldr.w r0, =ulMaxSyscallInterruptPriorityConst\r
+       ldr r0, [r0]\r
        msr basepri, r0\r
        bl vTaskSwitchContext\r
        mov r0, #0\r
@@ -206,6 +208,7 @@ vPortStartFirstTask .type func
        msr msp, r0\r
        ;Call SVC to start the first task.\r
        cpsie i\r
+       cpsie f\r
        dsb\r
        isb\r
        svc 0\r
@@ -237,6 +240,7 @@ vPortEnableVFP .type func
 ulPortSetInterruptMask:\r
        mrs r0, basepri\r
        ldr.w r1, =ulMaxSyscallInterruptPriorityConst\r
+       ldr r1, [r1]\r
        msr basepri, r1\r
        bx r14\r
        .size   ulPortSetInterruptMask, $-ulPortSetInterruptMask\r