freertos: fix dual core issue

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
This commit is contained in:
Liu Zhi Fu 2016-12-22 10:17:39 +08:00
parent a760eb3980
commit 2cffaf9cc8

View 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;
}