freertos: protect calls to prvAddTaskToReadyList with xTaskQueueMutex

This commit is contained in:
Ivan Grokhotkov
2016-09-05 10:22:37 +08:00
parent 9664de6867
commit 1c6859573b

View File

@@ -3614,6 +3614,7 @@ In fact, nothing below this line has/is.
{ {
if( pxTCB->uxPriority < pxCurrentTCB[ xPortGetCoreID() ]->uxPriority ) if( pxTCB->uxPriority < pxCurrentTCB[ xPortGetCoreID() ]->uxPriority )
{ {
taskENTER_CRITICAL(&xTaskQueueMutex);
/* Adjust the mutex holder state to account for its new /* Adjust the mutex holder state to account for its new
priority. Only reset the event list item value if the value is priority. Only reset the event list item value if the value is
not being used for anything else. */ not being used for anything else. */
@@ -3649,6 +3650,8 @@ In fact, nothing below this line has/is.
pxTCB->uxPriority = pxCurrentTCB[ xPortGetCoreID() ]->uxPriority; pxTCB->uxPriority = pxCurrentTCB[ xPortGetCoreID() ]->uxPriority;
} }
taskEXIT_CRITICAL(&xTaskQueueMutex);
traceTASK_PRIORITY_INHERIT( pxTCB, pxCurrentTCB[ xPortGetCoreID() ]->uxPriority ); traceTASK_PRIORITY_INHERIT( pxTCB, pxCurrentTCB[ xPortGetCoreID() ]->uxPriority );
} }
else else
@@ -3686,6 +3689,7 @@ In fact, nothing below this line has/is.
/* Only disinherit if no other mutexes are held. */ /* Only disinherit if no other mutexes are held. */
if( pxTCB->uxMutexesHeld == ( UBaseType_t ) 0 ) if( pxTCB->uxMutexesHeld == ( UBaseType_t ) 0 )
{ {
taskENTER_CRITICAL(&xTaskQueueMutex);
/* A task can only have an inhertied priority if it holds /* A task can only have an inhertied priority if it holds
the mutex. If the mutex is held by a task then it cannot be the mutex. If the mutex is held by a task then it cannot be
given from an interrupt, and if a mutex is given by the given from an interrupt, and if a mutex is given by the
@@ -3720,6 +3724,7 @@ In fact, nothing below this line has/is.
switch should occur when the last mutex is returned whether switch should occur when the last mutex is returned whether
a task is waiting on it or not. */ a task is waiting on it or not. */
xReturn = pdTRUE; xReturn = pdTRUE;
taskEXIT_CRITICAL(&xTaskQueueMutex);
} }
else else
{ {