]> git.sur5r.net Git - freertos/commitdiff
Make the parameters to vPortDefineHeapRegions() const.
authorrtel <rtel@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Fri, 4 Jul 2014 13:17:21 +0000 (13:17 +0000)
committerrtel <rtel@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Fri, 4 Jul 2014 13:17:21 +0000 (13:17 +0000)
Add additional asserts to the Keil CM3 and CM4F ports (other CM3/4 ports already updated).
Add the additional yield necessitated by the mutex held count to the case when configUSE_QUEUE_SETS is 0.

git-svn-id: https://svn.code.sf.net/p/freertos/code/trunk@2271 1d2547de-c912-0410-9cb9-b8ca96c0e9e2

FreeRTOS/Source/include/portable.h
FreeRTOS/Source/portable/MemMang/heap_5.c
FreeRTOS/Source/portable/RVDS/ARM_CM3/port.c
FreeRTOS/Source/portable/RVDS/ARM_CM4F/port.c
FreeRTOS/Source/queue.c

index b602d8aa59025932613036664bf420e50afb0cc6..619daf9a7e0b9e8e586eda3a06a6374daf848e6b 100644 (file)
@@ -381,7 +381,7 @@ typedef struct HeapRegion
  * terminated by a HeapRegions_t structure that has a size of 0.  The region \r
  * with the lowest start address must appear first in the array.\r
  */\r
-void vPortDefineHeapRegions( HeapRegion_t *pxHeapRegions );\r
+void vPortDefineHeapRegions( const HeapRegion_t * const pxHeapRegions );\r
 \r
 \r
 /*\r
index 813e29f409b02145148708cb038401e2e64bbabe..9a15ac1827275668ff7f605d7b6d38371315c767 100644 (file)
@@ -424,14 +424,14 @@ uint8_t *puc;
 }\r
 /*-----------------------------------------------------------*/\r
 \r
-void vPortDefineHeapRegions( HeapRegion_t *pxHeapRegions )\r
+void vPortDefineHeapRegions( const HeapRegion_t * const pxHeapRegions )\r
 {\r
 BlockLink_t *pxFirstFreeBlockInRegion = NULL, *pxPreviousFreeBlock;\r
 uint8_t *pucAlignedHeap;\r
 size_t xTotalRegionSize, xTotalHeapSize = 0;\r
 BaseType_t xDefinedRegions = 0;\r
 uint32_t ulAddress;\r
-HeapRegion_t *pxHeapRegion;\r
+const HeapRegion_t *pxHeapRegion;\r
 \r
        /* Can only call once! */\r
        configASSERT( pxEnd == NULL );\r
index d813c5b06dd5f6d30d166f5adcdc2d6f419097df..cfefb2cef7705afe1d8de86a2ab7c7198c19ca3d 100644 (file)
@@ -110,6 +110,9 @@ is defined. */
 #define portNVIC_PENDSVCLEAR_BIT                       ( 1UL << 27UL )\r
 #define portNVIC_PEND_SYSTICK_CLEAR_BIT                ( 1UL << 25UL )\r
 \r
+/* Masks off all bits but the VECTACTIVE bits in the ICSR register. */\r
+#define portVECTACTIVE_MASK                                    ( 0x1FUL )\r
+\r
 #define portNVIC_PENDSV_PRI                                    ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL )\r
 #define portNVIC_SYSTICK_PRI                           ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL )\r
 \r
@@ -268,11 +271,13 @@ __asm void prvStartFirstTask( void )
        msr msp, r0\r
        /* Globally enable interrupts. */\r
        cpsie i\r
+       cpsie f\r
        dsb\r
        isb\r
        /* Call SVC to start the first task. */\r
        svc 0\r
        nop\r
+       nop\r
 }\r
 /*-----------------------------------------------------------*/\r
 \r
@@ -370,6 +375,16 @@ void vPortEnterCritical( void )
        uxCriticalNesting++;\r
        __dsb( portSY_FULL_READ_WRITE );\r
        __isb( portSY_FULL_READ_WRITE );\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 7215ce788c2ef84c175a424053654d79200ac33a..6e47b3713d6bd3948e1356f13f6183bab132abb1 100644 (file)
@@ -123,6 +123,9 @@ is defined. */
 #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
@@ -290,11 +293,13 @@ __asm void prvStartFirstTask( void )
        msr msp, r0\r
        /* Globally enable interrupts. */\r
        cpsie i\r
+       cpsie f\r
        dsb\r
        isb\r
        /* Call SVC to start the first task. */\r
        svc 0\r
        nop\r
+       nop\r
 }\r
 /*-----------------------------------------------------------*/\r
 \r
@@ -414,6 +419,16 @@ void vPortEnterCritical( void )
        uxCriticalNesting++;\r
        __dsb( portSY_FULL_READ_WRITE );\r
        __isb( portSY_FULL_READ_WRITE );\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 48e05fd41bf8719da8c7d95a8dce5da120f6cf30..278178fe099cb1d540b58e51c7c983fb79fac399 100644 (file)
@@ -511,7 +511,7 @@ QueueHandle_t xReturn = NULL;
                }\r
                else\r
                {\r
-                       /* The mutex cannot be given because the calling task is not the \r
+                       /* The mutex cannot be given because the calling task is not the\r
                        holder. */\r
                        xReturn = pdFAIL;\r
 \r
@@ -547,7 +547,7 @@ QueueHandle_t xReturn = NULL;
                {\r
                        xReturn = xQueueGenericReceive( pxMutex, NULL, xTicksToWait, pdFALSE );\r
 \r
-                       /* pdPASS will only be returned if the mutex was successfully \r
+                       /* pdPASS will only be returned if the mutex was successfully\r
                        obtained.  The calling task may have entered the Blocked state\r
                        before reaching here. */\r
                        if( xReturn == pdPASS )\r
@@ -695,6 +695,14 @@ Queue_t * const pxQueue = ( Queue_t * ) xQueue;
                                                        mtCOVERAGE_TEST_MARKER();\r
                                                }\r
                                        }\r
+                                       else if( xYieldRequired != pdFALSE )\r
+                                       {\r
+                                               /* This path is a special case that will only get\r
+                                               executed if the task was holding multiple mutexes and\r
+                                               the mutexes were given back in an order that is\r
+                                               different to that in which they were taken. */\r
+                                               queueYIELD_IF_USING_PREEMPTION();\r
+                                       }                                       \r
                                        else\r
                                        {\r
                                                mtCOVERAGE_TEST_MARKER();\r
@@ -1627,7 +1635,7 @@ BaseType_t xReturn = pdFALSE;
                                /* The mutex is no longer being held. */\r
                                vTaskDecrementMutexHeldCount();\r
                                xReturn = xTaskPriorityDisinherit( ( void * ) pxQueue->pxMutexHolder );\r
-                               pxQueue->pxMutexHolder = NULL;                          \r
+                               pxQueue->pxMutexHolder = NULL;\r
                        }\r
                        else\r
                        {\r