]> git.sur5r.net Git - freertos/commitdiff
Add code to assert() if non ISR safe API function is called from ISR in IAR and GCC...
authorrtel <rtel@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Sat, 14 Jun 2014 13:56:25 +0000 (13:56 +0000)
committerrtel <rtel@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Sat, 14 Jun 2014 13:56:25 +0000 (13:56 +0000)
git-svn-id: https://svn.code.sf.net/p/freertos/code/trunk@2261 1d2547de-c912-0410-9cb9-b8ca96c0e9e2

FreeRTOS/Source/portable/GCC/ARM_CA9/port.c
FreeRTOS/Source/portable/GCC/ARM_CM3/port.c
FreeRTOS/Source/portable/GCC/ARM_CM4F/port.c
FreeRTOS/Source/portable/IAR/ARM_CM3/port.c
FreeRTOS/Source/portable/IAR/ARM_CM3/portasm.s
FreeRTOS/Source/portable/IAR/ARM_CM4F/port.c
FreeRTOS/Source/portable/IAR/ARM_CM4F/portasm.s

index 0f0cba0a37599f71fdc7bcfc3cb27b5fe756f813..91cb2d707142bd86ff3ff6701450c176c255651f 100644 (file)
@@ -379,10 +379,11 @@ void vPortEnterCritical( void )
        portENTER_CRITICAL() has been called. */\r
        ulCriticalNesting++;\r
 \r
-       /* This is not the interrupt safe version of the enter critical function.\r
-       Only API functions that end in "FromISR" can be used in an interrupt.  The\r
-       test of ulCriticalNesting() guards against recursive calls to assert in the\r
-       case that assert itself contains a call to taskENTER_CRITICAL. */\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( ulPortInterruptNesting == 0 );\r
index 01956f5484eea49393ebc8c05feda190fdd946ec..0ba306c6f5df8a759fd74d65081e03ae63128ac7 100644 (file)
@@ -113,6 +113,9 @@ FreeRTOS.org versions prior to V4.4.0 did not include this definition. */
 #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 set up the initial stack. */\r
 #define portINITIAL_XPSR                                       ( 0x01000000UL )\r
 \r
@@ -262,6 +265,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
@@ -374,6 +378,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
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
index f6e4280e14c51bae6de32f60a0dc19e1f04f639c..b05587c442daf73b71f9cd08862fbf91e496bcf4 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 set up the initial stack. */\r
 #define portINITIAL_XPSR                                       ( 0x01000000 )\r
 \r
@@ -324,6 +327,16 @@ void vPortEnterCritical( void )
        uxCriticalNesting++;\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( uxCriticalNesting == 1 )\r
+       {\r
+               configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 );\r
+       }\r
 }\r
 /*-----------------------------------------------------------*/\r
 \r
index cf6d78bd6bd905eb6b4f5378aa683a5410f1711d..52aa94538707305ce570c136c72781f69ed4f6b4 100644 (file)
@@ -145,8 +145,9 @@ vPortStartFirstTask
        ldr r0, [r0]\r
        /* Set the msp back to the start of the stack. */\r
        msr msp, r0\r
-       /* Call SVC to start the first task. */\r
+       /* Call SVC to start the first task, ensuring interrupts are enabled. */\r
        cpsie i\r
+       cpsie f\r
        dsb\r
        isb\r
        svc 0\r
index 11a67eb9151afb5b1775df1651b5d1e533dcac76..4546de459204fa36654ad6ce37ae6c449dac2cb2 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
@@ -350,6 +353,16 @@ void vPortEnterCritical( void )
        uxCriticalNesting++;\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( uxCriticalNesting == 1 )\r
+       {\r
+               configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 );\r
+       }\r
 }\r
 /*-----------------------------------------------------------*/\r
 \r
index 15c8869348c55bf0bc83c6006dc3886a753176bf..5631a745ae45c66fec650f95cd29175d06219029 100644 (file)
@@ -172,6 +172,7 @@ vPortStartFirstTask
        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