]> git.sur5r.net Git - freertos/blobdiff - FreeRTOS/Source/portable/GCC/ARM_CM4F/port.c
Add code to assert() if non ISR safe API function is called from ISR in IAR and GCC...
[freertos] / FreeRTOS / Source / portable / GCC / ARM_CM4F / port.c
index f78a5fbcd1bd33ca66378384aed336b228d23c73..3bd37f7a162107c11cbe9891064a3a943638ff28 100644 (file)
 #define portPRIORITY_GROUP_MASK                                ( 0x07UL << 8UL )\r
 #define portPRIGROUP_SHIFT                                     ( 8UL )\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
@@ -280,6 +283,7 @@ static void prvPortStartFirstTask( void )
                                        " ldr r0, [r0]                  \n"\r
                                        " msr msp, r0                   \n" /* Set the msp back to the start of the stack. */\r
                                        " cpsie i                               \n" /* Globally enable interrupts. */\r
+                                       " cpsie f                               \n"\r
                                        " dsb                                   \n"\r
                                        " isb                                   \n"\r
                                        " svc 0                                 \n" /* System call to start first task. */\r
@@ -398,6 +402,16 @@ void vPortEnterCritical( void )
        uxCriticalNesting++;\r
        __asm volatile( "dsb" );\r
        __asm volatile( "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( uxCriticalNesting == 1 )\r
+       {\r
+               configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 );\r
+       }\r
 }\r
 /*-----------------------------------------------------------*/\r
 \r