Update taskYIELD_IF_USING_PREEMPTION macro (#769)
* Add taskYIELD_TASK_CORE_IF_USING_PREEMPTION and taskYIELD_ANY_CORE_IF_USING_PREEMPTION to align task yield behavior for single core and SMP.
---------
Co-authored-by: Soren Ptak <ptaksoren@gmail.com>
diff --git a/tasks.c b/tasks.c
index eee6a8c..31e3754 100644
--- a/tasks.c
+++ b/tasks.c
@@ -58,16 +58,49 @@
#include <stdio.h>
#endif /* configUSE_STATS_FORMATTING_FUNCTIONS == 1 ) */
-#if ( configNUMBER_OF_CORES == 1 )
- #if ( configUSE_PREEMPTION == 0 )
+#if ( configUSE_PREEMPTION == 0 )
/* If the cooperative scheduler is being used then a yield should not be
* performed just because a higher priority task has been woken. */
- #define taskYIELD_IF_USING_PREEMPTION()
- #else
- #define taskYIELD_IF_USING_PREEMPTION() portYIELD_WITHIN_API()
- #endif
-#endif /* if ( configNUMBER_OF_CORES == 1 ) */
+ #define taskYIELD_TASK_CORE_IF_USING_PREEMPTION( pxTCB )
+ #define taskYIELD_ANY_CORE_IF_USING_PREEMPTION( pxTCB )
+#else
+
+ #if ( configNUMBER_OF_CORES == 1 )
+
+/* This macro requests the running task pxTCB to yield. In single core
+ * scheduler, a running task always runs on core 0 and portYIELD_WITHIN_API()
+ * can be used to request the task running on core 0 to yield. Therefore, pxTCB
+ * is not used in this macro. */
+ #define taskYIELD_TASK_CORE_IF_USING_PREEMPTION( pxTCB ) \
+ do { \
+ ( void ) ( pxTCB ); \
+ portYIELD_WITHIN_API(); \
+ } while( 0 )
+
+ #define taskYIELD_ANY_CORE_IF_USING_PREEMPTION( pxTCB ) \
+ do { \
+ if( pxCurrentTCB->uxPriority < ( pxTCB )->uxPriority ) \
+ { \
+ portYIELD_WITHIN_API(); \
+ } \
+ else \
+ { \
+ mtCOVERAGE_TEST_MARKER(); \
+ } \
+ } while( 0 )
+
+ #else /* if ( configNUMBER_OF_CORES == 1 ) */
+
+/* Yield the core on which this task is running. */
+ #define taskYIELD_TASK_CORE_IF_USING_PREEMPTION( pxTCB ) prvYieldCore( ( pxTCB )->xTaskRunState )
+
+/* Yield for the task if a running task has priority lower than this task. */
+ #define taskYIELD_ANY_CORE_IF_USING_PREEMPTION( pxTCB ) prvYieldForTask( pxTCB )
+
+ #endif /* #if ( configNUMBER_OF_CORES == 1 ) */
+
+#endif /* if ( configUSE_PREEMPTION == 0 ) */
/* Values that can be assigned to the ucNotifyState member of the TCB. */
#define taskNOT_WAITING_NOTIFICATION ( ( uint8_t ) 0 ) /* Must be zero as it is the initialised value. */
@@ -1776,14 +1809,7 @@
{
/* If the created task is of a higher priority than the current task
* then it should run now. */
- if( pxCurrentTCB->uxPriority < pxNewTCB->uxPriority )
- {
- taskYIELD_IF_USING_PREEMPTION();
- }
- else
- {
- mtCOVERAGE_TEST_MARKER();
- }
+ taskYIELD_ANY_CORE_IF_USING_PREEMPTION( pxNewTCB );
}
else
{
@@ -1859,9 +1885,7 @@
/* If the created task is of a higher priority than another
* currently running task and preemption is on then it should
* run now. */
- #if ( configUSE_PREEMPTION == 1 )
- prvYieldForTask( pxNewTCB );
- #endif
+ taskYIELD_ANY_CORE_IF_USING_PREEMPTION( pxNewTCB );
}
else
{
@@ -2525,37 +2549,27 @@
#endif
}
- #if ( configNUMBER_OF_CORES == 1 )
+ if( xYieldRequired != pdFALSE )
{
- if( xYieldRequired != pdFALSE )
- {
- taskYIELD_IF_USING_PREEMPTION();
- }
- else
+ /* The running task priority is set down. Request the task to yield. */
+ taskYIELD_TASK_CORE_IF_USING_PREEMPTION( pxTCB );
+ }
+ else
+ {
+ #if ( configNUMBER_OF_CORES > 1 )
+ if( xYieldForTask != pdFALSE )
+ {
+ /* The priority of the task is being raised. If a running
+ * task has priority lower than this task, it should yield
+ * for this task. */
+ taskYIELD_ANY_CORE_IF_USING_PREEMPTION( pxTCB );
+ }
+ else
+ #endif /* if ( configNUMBER_OF_CORES > 1 ) */
{
mtCOVERAGE_TEST_MARKER();
}
}
- #else /* #if ( configNUMBER_OF_CORES == 1 ) */
- {
- #if ( configUSE_PREEMPTION == 1 )
- {
- if( xYieldRequired != pdFALSE )
- {
- prvYieldCore( pxTCB->xTaskRunState );
- }
- else if( xYieldForTask != pdFALSE )
- {
- prvYieldForTask( pxTCB );
- }
- else
- {
- mtCOVERAGE_TEST_MARKER();
- }
- }
- #endif /* #if ( configUSE_PREEMPTION == 1 ) */
- }
- #endif /* #if ( configNUMBER_OF_CORES == 1 ) */
/* Remove compiler warning about unused variables when the port
* optimised task selection is not being used. */
@@ -2939,30 +2953,10 @@
( void ) uxListRemove( &( pxTCB->xStateListItem ) );
prvAddTaskToReadyList( pxTCB );
- #if ( configNUMBER_OF_CORES == 1 )
- {
- /* A higher priority task may have just been resumed. */
- if( pxTCB->uxPriority > pxCurrentTCB->uxPriority )
- {
- /* This yield may not cause the task just resumed to run,
- * but will leave the lists in the correct state for the
- * next yield. */
- taskYIELD_IF_USING_PREEMPTION();
- }
- else
- {
- mtCOVERAGE_TEST_MARKER();
- }
- }
- #else /* #if ( configNUMBER_OF_CORES == 1 ) */
- {
- #if ( configUSE_PREEMPTION == 1 )
- {
- prvYieldForTask( pxTCB );
- }
- #endif /* #if ( configUSE_PREEMPTION == 1 ) */
- }
- #endif /* #if ( configNUMBER_OF_CORES == 1 ) */
+ /* This yield may not cause the task just resumed to run,
+ * but will leave the lists in the correct state for the
+ * next yield. */
+ taskYIELD_ANY_CORE_IF_USING_PREEMPTION( pxTCB );
}
else
{
@@ -3618,7 +3612,7 @@
#if ( configNUMBER_OF_CORES == 1 )
{
- taskYIELD_IF_USING_PREEMPTION();
+ taskYIELD_TASK_CORE_IF_USING_PREEMPTION( pxCurrentTCB );
}
#endif /* #if ( configNUMBER_OF_CORES == 1 ) */
}
@@ -7063,28 +7057,9 @@
}
#endif
- #if ( configNUMBER_OF_CORES == 1 )
- {
- if( pxTCB->uxPriority > pxCurrentTCB->uxPriority )
- {
- /* The notified task has a priority above the currently
- * executing task so a yield is required. */
- taskYIELD_IF_USING_PREEMPTION();
- }
- else
- {
- mtCOVERAGE_TEST_MARKER();
- }
- }
- #else /* #if ( configNUMBER_OF_CORES == 1 ) */
- {
- #if ( configUSE_PREEMPTION == 1 )
- {
- prvYieldForTask( pxTCB );
- }
- #endif
- }
- #endif /* #if ( configNUMBER_OF_CORES == 1 ) */
+ /* Check if the notified task has a priority above the currently
+ * executing task. */
+ taskYIELD_ANY_CORE_IF_USING_PREEMPTION( pxTCB );
}
else
{