mirror of
https://github.com/FreeRTOS/FreeRTOS-Kernel.git
synced 2025-04-19 21:11:57 -04:00
Add critical section around xTaskCheckForTimeout() as the new queue code makes a call while the scheduler is not locked.
This commit is contained in:
parent
5ebd39bfc9
commit
ed28aa2046
|
@ -323,7 +323,7 @@ register tskTCB *pxTCB; \
|
||||||
/* Has the extremity of the task stack ever been written over? */ \
|
/* Has the extremity of the task stack ever been written over? */ \
|
||||||
if( memcmp( ( void * ) pxCurrentTCB->pxStack, ( void * ) ucExpectedStackBytes, sizeof( ucExpectedStackBytes ) ) != 0 ) \
|
if( memcmp( ( void * ) pxCurrentTCB->pxStack, ( void * ) ucExpectedStackBytes, sizeof( ucExpectedStackBytes ) ) != 0 ) \
|
||||||
{ \
|
{ \
|
||||||
vApplicationStackOverflowHook( ( xTaskHandle ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \
|
vApplicationStackOverflowHook( ( xTaskHandle ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \
|
||||||
} \
|
} \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1560,36 +1560,40 @@ portBASE_TYPE xTaskCheckForTimeOut( xTimeOutType * const pxTimeOut, portTickType
|
||||||
{
|
{
|
||||||
portBASE_TYPE xReturn;
|
portBASE_TYPE xReturn;
|
||||||
|
|
||||||
#if ( INCLUDE_vTaskSuspend == 1 )
|
portENTER_CRITICAL();
|
||||||
/* If INCLUDE_vTaskSuspend is set to 1 and the block time specified is
|
{
|
||||||
the maximum block time then the task should block indefinitely, and
|
#if ( INCLUDE_vTaskSuspend == 1 )
|
||||||
therefore never time out. */
|
/* If INCLUDE_vTaskSuspend is set to 1 and the block time specified is
|
||||||
if( *pxTicksToWait == portMAX_DELAY )
|
the maximum block time then the task should block indefinitely, and
|
||||||
|
therefore never time out. */
|
||||||
|
if( *pxTicksToWait == portMAX_DELAY )
|
||||||
|
{
|
||||||
|
xReturn = pdFALSE;
|
||||||
|
}
|
||||||
|
else /* We are not blocking indefinitely, perform the checks below. */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if( ( xNumOfOverflows != pxTimeOut->xOverflowCount ) && ( xTickCount >= pxTimeOut->xTimeOnEntering ) )
|
||||||
{
|
{
|
||||||
|
/* The tick count is greater than the time at which vTaskSetTimeout()
|
||||||
|
was called, but has also overflowed since vTaskSetTimeOut() was called.
|
||||||
|
It must have wrapped all the way around and gone past us again. This
|
||||||
|
passed since vTaskSetTimeout() was called. */
|
||||||
|
xReturn = pdTRUE;
|
||||||
|
}
|
||||||
|
else if( ( xTickCount - pxTimeOut->xTimeOnEntering ) < *pxTicksToWait )
|
||||||
|
{
|
||||||
|
/* Not a genuine timeout. Adjust parameters for time remaining. */
|
||||||
|
*pxTicksToWait -= ( xTickCount - pxTimeOut->xTimeOnEntering );
|
||||||
|
vTaskSetTimeOutState( pxTimeOut );
|
||||||
xReturn = pdFALSE;
|
xReturn = pdFALSE;
|
||||||
}
|
}
|
||||||
else /* We are not blocking indefinitely, perform the checks below. */
|
else
|
||||||
#endif
|
{
|
||||||
|
xReturn = pdTRUE;
|
||||||
if( ( xNumOfOverflows != pxTimeOut->xOverflowCount ) && ( xTickCount >= pxTimeOut->xTimeOnEntering ) )
|
}
|
||||||
{
|
}
|
||||||
/* The tick count is greater than the time at which vTaskSetTimeout()
|
portEXIT_CRITICAL();
|
||||||
was called, but has also overflowed since vTaskSetTimeOut() was called.
|
|
||||||
It must have wrapped all the way around and gone past us again. This
|
|
||||||
passed since vTaskSetTimeout() was called. */
|
|
||||||
xReturn = pdTRUE;
|
|
||||||
}
|
|
||||||
else if( ( xTickCount - pxTimeOut->xTimeOnEntering ) < *pxTicksToWait )
|
|
||||||
{
|
|
||||||
/* Not a genuine timeout. Adjust parameters for time remaining. */
|
|
||||||
*pxTicksToWait -= ( xTickCount - pxTimeOut->xTimeOnEntering );
|
|
||||||
vTaskSetTimeOutState( pxTimeOut );
|
|
||||||
xReturn = pdFALSE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
xReturn = pdTRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return xReturn;
|
return xReturn;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue