]> granicus.if.org Git - esp-idf/commitdiff
freertos: fix dual core issue
authorLiu Zhi Fu <liuzhifu@espressif.com>
Thu, 22 Dec 2016 02:17:39 +0000 (10:17 +0800)
committerLiu Zhi Fu <liuzhifu@espressif.com>
Thu, 22 Dec 2016 02:17:39 +0000 (10:17 +0800)
This commit fixes:
1. xTaskGetCurrentTaskHandle may return wrong TCB when current task switch to a different core
2. Idle task may have problem when it terminate the task in both core

components/freertos/tasks.c

index 16cce3b967cfe496b9eb6e853d55a445a5ab28be..baaccb43e588fcc8853088ca9a73b0107ff89f67 100644 (file)
@@ -3496,26 +3496,27 @@ static void prvCheckTasksWaitingTermination( void )
 
                /* ucTasksDeleted is used to prevent vTaskSuspendAll() being called
                too often in the idle task. */
+               taskENTER_CRITICAL(&xTaskQueueMutex);
                while( uxTasksDeleted > ( UBaseType_t ) 0U )
                {
-                       taskENTER_CRITICAL(&xTaskQueueMutex);
+                       //taskENTER_CRITICAL(&xTaskQueueMutex);
                        {
                                xListIsEmpty = listLIST_IS_EMPTY( &xTasksWaitingTermination );
                        }
-                       taskEXIT_CRITICAL(&xTaskQueueMutex);
+                       //taskEXIT_CRITICAL(&xTaskQueueMutex);
 
                        if( xListIsEmpty == pdFALSE )
                        {
                                TCB_t *pxTCB;
 
-                               taskENTER_CRITICAL(&xTaskQueueMutex);
+                               //taskENTER_CRITICAL(&xTaskQueueMutex);
                                {
                                        pxTCB = ( TCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( ( &xTasksWaitingTermination ) );
                                        ( void ) uxListRemove( &( pxTCB->xGenericListItem ) );
                                        --uxCurrentNumberOfTasks;
                                        --uxTasksDeleted;
                                }
-                               taskEXIT_CRITICAL(&xTaskQueueMutex);
+                               //taskEXIT_CRITICAL(&xTaskQueueMutex);
                                
                                #if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0 ) && ( configTHREAD_LOCAL_STORAGE_DELETE_CALLBACKS )
                                {
@@ -3535,7 +3536,8 @@ static void prvCheckTasksWaitingTermination( void )
                        {
                                mtCOVERAGE_TEST_MARKER();
                        }
-               }
+               }               
+               taskEXIT_CRITICAL(&xTaskQueueMutex);
        }
        #endif /* vTaskDelete */
 }
@@ -3806,10 +3808,12 @@ TCB_t *pxTCB;
        {
        TaskHandle_t xReturn;
 
+                vPortCPUAcquireMutex(&xTaskQueueMutex);
                /* A critical section is not required as this is not called from
                an interrupt and the current TCB will always be the same for any
                individual execution thread. */
                xReturn = pxCurrentTCB[ xPortGetCoreID() ];
+                vPortCPUReleaseMutex(&xTaskQueueMutex);
 
                return xReturn;
        }