mirror of
https://github.com/FreeRTOS/FreeRTOS-Kernel.git
synced 2025-04-19 13:01: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 ) );
|
||||
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
|
||||
{
|
||||
|
@ -8198,6 +8214,22 @@ TickType_t uxTaskResetEventItemValue( void )
|
|||
{
|
||||
listREMOVE_ITEM( &( pxTCB->xStateListItem ) );
|
||||
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
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue