]> git.sur5r.net Git - freertos/commitdiff
Minor changes to the TriCore port made during test/validation.
authorrichardbarry <richardbarry@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Mon, 24 Oct 2011 12:30:35 +0000 (12:30 +0000)
committerrichardbarry <richardbarry@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Mon, 24 Oct 2011 12:30:35 +0000 (12:30 +0000)
git-svn-id: https://svn.code.sf.net/p/freertos/code/trunk@1623 1d2547de-c912-0410-9cb9-b8ca96c0e9e2

Source/include/FreeRTOS.h
Source/portable/GCC/TriCore_1782/port.c
Source/portable/GCC/TriCore_1782/portmacro.h
Source/tasks.c

index b2446430aefb81bef1e743050e51a9e98a3f87c2..baa77afbc22e14010e9e31ab3b5494b2b3a5da71 100644 (file)
@@ -226,6 +226,9 @@ typedef portBASE_TYPE (*pdTASK_HOOK_CODE)( void * );
        #define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedStatusValue ) ( void ) uxSavedStatusValue\r
 #endif\r
 \r
+#ifndef portCLEAN_UP_TCB\r
+       #define portCLEAN_UP_TCB( pxTCB ) ( void ) pxTCB\r
+#endif\r
 \r
 #ifndef configQUEUE_REGISTRY_SIZE\r
        #define configQUEUE_REGISTRY_SIZE 0U\r
index eadcc01707eb48ae7b0d91c7817f03933b606ab5..4f4dc4d27031ff6ae88a68fd497336655a52bdda 100644 (file)
@@ -75,6 +75,7 @@
 \r
 #define portINITIAL_SYSCON                                                             ( (unsigned portBASE_TYPE) 0x00000000 ) /* MPU Disable. */\r
 \r
+/* This macro should be used when the MPU is being used. */\r
 #define portSELECT_PROGRAM_STATUS_WORD( xRunPrivileged )               ( ( xRunPrivileged ) ? portINITIAL_PRIVILEGED_PROGRAM_STATUS_WORD : portINITIAL_UNPRIVILEGED_PROGRAM_STATUS_WORD )\r
 \r
 /* CSA manipulation macros. */\r
@@ -173,7 +174,7 @@ unsigned portBASE_TYPE *pxLowerCSA = NULL;
 \r
        /* Upper Context. */\r
        pxUpperCSA[ 2 ] = (unsigned portBASE_TYPE)pxTopOfStack;                         /* A10; Stack Return aka Stack Pointer */\r
-       pxUpperCSA[ 1 ] = portSELECT_PROGRAM_STATUS_WORD( pdTRUE );                     /* PSW  */\r
+       pxUpperCSA[ 1 ] = portSYSTEM_PROGRAM_STATUS_WORD;                                       /* PSW  */\r
 \r
        /* Clear the CSA. */\r
        memset( pxLowerCSA, 0, 16 * sizeof( unsigned portBASE_TYPE ) );\r
@@ -318,50 +319,57 @@ void vPortSystemTickHandler( int iArg )
 void vPortReclaimCSA( unsigned portBASE_TYPE *pxTCB )\r
 {\r
 unsigned portBASE_TYPE pxHeadCSA, pxTailCSA, pxFreeCSA;\r
+unsigned portBASE_TYPE *pulNextCSA;\r
 \r
-       /* The first element in a TCB is the Last Used CSA.\r
-        * These simply need to be free'd to add them back to\r
-        * the global pool of CSAs.\r
-        */\r
-\r
-       /* Lookup the first element from the TCB. */\r
+       /* A pointer to the first CSA in the list of CSAs consumed by the task is\r
+       stored in the first element of the tasks TCB structure (where the stack\r
+       pointer would be on a traditional stack based architecture). */\r
        pxHeadCSA = ( *pxTCB ) & portCSA_FCX_MASK;\r
 \r
-       /* If there is something to reclaim. */\r
-       if ( 0UL != ( pxHeadCSA & portCSA_FCX_MASK ) )\r
+       /* Mask off everything in the CSA link field other than the address.  If\r
+       the     address is NULL, then the CSA is not linking anywhere and there is\r
+       nothing to do. */\r
+       pxTailCSA = pxHeadCSA;\r
+\r
+       /* Convert the link value to contain just a raw address and store this\r
+       in a local variable. */\r
+       pulNextCSA = portCSA_TO_ADDRESS( pxTailCSA );\r
+\r
+       /* Iterate over the CSAs that were consumed as part of the task.  The\r
+       first field in the CSA is the pointer to then next CSA.  Mask off\r
+       everything in the pointer to the next CSA, other than the link address.\r
+       If this is NULL, then the CSA currently being pointed to is the last in\r
+       the chain. */\r
+       while( 0UL != ( pulNextCSA[ 0 ] & portCSA_FCX_MASK ) )\r
        {\r
-               /* Iterate over the CSAs that were consumed as part of the task. */\r
-               pxTailCSA = pxHeadCSA;\r
-               while ( 0UL != ( portCSA_TO_ADDRESS( pxTailCSA )[ 0 ] & portCSA_FCX_MASK ) )\r
-               {\r
-                       /* Clear any extra bits from the link words. */\r
-                       portCSA_TO_ADDRESS( pxTailCSA )[ 0 ] = pxTailCSA & portCSA_FCX_MASK;\r
+               /* Clear all bits of the pointer to the next in the chain, other\r
+               than the address bits themselves. */\r
+               pulNextCSA[ 0 ] = pulNextCSA[ 0 ] & portCSA_FCX_MASK;\r
 \r
-                       /* Iterate to the next CSA. */\r
-                       pxTailCSA = portCSA_TO_ADDRESS( pxTailCSA )[ 0 ];\r
-               }\r
+               /* Move the pointer to point to the next CSA in the list. */\r
+               pxTailCSA = pulNextCSA[ 0 ];\r
 \r
-               /* pxHeadCSA points to the first in the chain\r
-                * pxNextCSA points to the Head or the last in the chain.\r
-                */\r
+               /* Update the local pointer to the CSA. */\r
+               pulNextCSA = portCSA_TO_ADDRESS( pxTailCSA );\r
+       }\r
 \r
-               portENTER_CRITICAL();\r
-               {\r
-                       /* Look up the current free CSA. */\r
-                       _dsync();\r
-                       pxFreeCSA = _mfcr( $FCX );\r
+       taskENTER_CRITICAL();\r
+       {\r
+               /* Look up the current free CSA head. */\r
+               _dsync();\r
+               pxFreeCSA = _mfcr( $FCX );\r
 \r
-                       /* Join the current Free onto the Tail of what is being reclaimed. */\r
-                       portCSA_TO_ADDRESS( pxTailCSA )[ 0 ] = pxFreeCSA;\r
+               /* Join the current Free onto the Tail of what is being reclaimed. */\r
+               portCSA_TO_ADDRESS( pxTailCSA )[ 0 ] = pxFreeCSA;\r
 \r
-                       /* Move the head of the reclaimed into the Free. */\r
-                       _dsync();\r
-                       _mtcr( $FCX, pxHeadCSA );\r
-                       /* ISync to commit the change to the FCX. */\r
-                       _isync();\r
-               }\r
-               portEXIT_CRITICAL();\r
+               /* Move the head of the reclaimed into the Free. */\r
+               _dsync();\r
+               _mtcr( $FCX, pxHeadCSA );\r
+\r
+               /* ISync to commit the change to the FCX. */\r
+               _isync();\r
        }\r
+       taskEXIT_CRITICAL();\r
 }\r
 /*-----------------------------------------------------------*/\r
 \r
index 17f20e6989a2974771b5a564745f6d5d61b841c5..65cb1926c16f9072330169096a69088a85248e9e 100644 (file)
@@ -187,6 +187,13 @@ unsigned portBASE_TYPE xUpperCSA = 0UL;                                                    \
 #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters )\r
 /*---------------------------------------------------------------------------*/\r
 \r
+/*\r
+ * Port specific clean up macro required to free the CSAs that were consumed by\r
+ * a task that has since been deleted.\r
+ */\r
+void vPortReclaimCSA( unsigned portBASE_TYPE *pxTCB );\r
+#define portCLEAN_UP_TCB( pxTCB )              vPortReclaimCSA( ( unsigned portBASE_TYPE *) ( pxTCB ) )\r
+\r
 #ifdef __cplusplus\r
 }\r
 #endif\r
index a7d4f237010504f01387f039141129822a61b8a6..3a4b21d75a53403df05280c6c01e133d75693d53 100644 (file)
@@ -2347,6 +2347,10 @@ tskTCB *pxNewTCB;
 \r
        static void prvDeleteTCB( tskTCB *pxTCB )\r
        {\r
+               /* This call is required specifically for the TriCore port.  It must be\r
+               above the vPortFree() calls. */\r
+               portCLEAN_UP_TCB( pxTCB );\r
+\r
                /* Free up the memory allocated by the scheduler for the task.  It is up to\r
                the task to free any memory allocated at the application level. */\r
                vPortFreeAligned( pxTCB->pxStack );\r