mirror of
https://github.com/FreeRTOS/FreeRTOS-Kernel.git
synced 2025-04-19 21:11:57 -04:00
Reset xNextTaskUnblockTime in task notify FromISR APIs (#1111)
* Reset xNextTaskUnblockTime in task notify FromISR APIs If a task is blocked waiting for a notification then xNextTaskUnblockTime might be set to the blocked task's timeout time. If the task is unblocked for a reason other than a timeout xNextTaskUnblockTime is normally left unchanged, because it will automatically get reset to a new value when the tick count equals xNextTaskUnblockTime. However if tickless idle is used it is important to enter sleep mode at the earliest possible time - so reset xNextTaskUnblockTime here to ensure it is updated at the earliest possible time. This was reported here - https://forums.freertos.org/t/the-vtaskgenericnotifygivefromisr-function-need-call-prvresetnexttaskunblocktime/21090 Signed-off-by: Gaurav Aggarwal <aggarg@amazon.com>
This commit is contained in:
parent
d750173b76
commit
53c7e7c46f
32
tasks.c
32
tasks.c
|
@ -8080,6 +8080,22 @@ TickType_t uxTaskResetEventItemValue( void )
|
||||||
{
|
{
|
||||||
listREMOVE_ITEM( &( pxTCB->xStateListItem ) );
|
listREMOVE_ITEM( &( pxTCB->xStateListItem ) );
|
||||||
prvAddTaskToReadyList( pxTCB );
|
prvAddTaskToReadyList( pxTCB );
|
||||||
|
|
||||||
|
#if ( configUSE_TICKLESS_IDLE != 0 )
|
||||||
|
{
|
||||||
|
/* If a task is blocked waiting for a notification then
|
||||||
|
* xNextTaskUnblockTime might be set to the blocked task's time
|
||||||
|
* out time. If the task is unblocked for a reason other than
|
||||||
|
* a timeout xNextTaskUnblockTime is normally left unchanged,
|
||||||
|
* because it will automatically get reset to a new value when
|
||||||
|
* the tick count equals xNextTaskUnblockTime. However if
|
||||||
|
* tickless idling is used it might be more important to enter
|
||||||
|
* sleep mode at the earliest possible time - so reset
|
||||||
|
* xNextTaskUnblockTime here to ensure it is updated at the
|
||||||
|
* earliest possible time. */
|
||||||
|
prvResetNextTaskUnblockTime();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -8198,6 +8214,22 @@ TickType_t uxTaskResetEventItemValue( void )
|
||||||
{
|
{
|
||||||
listREMOVE_ITEM( &( pxTCB->xStateListItem ) );
|
listREMOVE_ITEM( &( pxTCB->xStateListItem ) );
|
||||||
prvAddTaskToReadyList( pxTCB );
|
prvAddTaskToReadyList( pxTCB );
|
||||||
|
|
||||||
|
#if ( configUSE_TICKLESS_IDLE != 0 )
|
||||||
|
{
|
||||||
|
/* If a task is blocked waiting for a notification then
|
||||||
|
* xNextTaskUnblockTime might be set to the blocked task's time
|
||||||
|
* out time. If the task is unblocked for a reason other than
|
||||||
|
* a timeout xNextTaskUnblockTime is normally left unchanged,
|
||||||
|
* because it will automatically get reset to a new value when
|
||||||
|
* the tick count equals xNextTaskUnblockTime. However if
|
||||||
|
* tickless idling is used it might be more important to enter
|
||||||
|
* sleep mode at the earliest possible time - so reset
|
||||||
|
* xNextTaskUnblockTime here to ensure it is updated at the
|
||||||
|
* earliest possible time. */
|
||||||
|
prvResetNextTaskUnblockTime();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue