Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/FreeRTOS/FreeRTOS-Kernel.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorchinglee-iot <61685396+chinglee-iot@users.noreply.github.com>2023-10-04 14:33:28 +0300
committerGitHub <noreply@github.com>2023-10-04 14:33:28 +0300
commit30e13dac2bd97b7c1429cdead03406d94a83a042 (patch)
tree2caf4e7a27b1565e27e79bd91f945fa357ffaad6 /tasks.c
parent830533d49e70806b4f46dade245c2f05f0c06b0f (diff)
Implement prvYieldCore with macro (#785)
* Implement prvYieldCore with macro for performance and memory * Remove the portCHECK_IF_IN_ISR macro check. It is not required in SMP now Co-authored-by: kar-rahul-aws <118818625+kar-rahul-aws@users.noreply.github.com> Co-authored-by: Gaurav-Aggarwal-AWS <33462878+aggarg@users.noreply.github.com>
Diffstat (limited to 'tasks.c')
-rw-r--r--tasks.c60
1 files changed, 25 insertions, 35 deletions
diff --git a/tasks.c b/tasks.c
index 000767bb5..e0fc15bcc 100644
--- a/tasks.c
+++ b/tasks.c
@@ -325,6 +325,31 @@
#define taskBITS_PER_BYTE ( ( size_t ) 8 )
+#if ( configNUMBER_OF_CORES > 1 )
+
+/* Yields the given core. This must be called from a critical section and xCoreID
+ * must be valid. This macro is not required in single core since there is only
+ * one core to yield. */
+ #define prvYieldCore( xCoreID ) \
+ do { \
+ if( xCoreID == ( BaseType_t ) portGET_CORE_ID() ) \
+ { \
+ /* Pending a yield for this core since it is in the critical section. */ \
+ xYieldPendings[ xCoreID ] = pdTRUE; \
+ } \
+ else \
+ { \
+ /* Request other core to yield if it is not requested before. */ \
+ if( pxCurrentTCBs[ xCoreID ]->xTaskRunState != taskTASK_SCHEDULED_TO_YIELD ) \
+ { \
+ portYIELD_CORE( xCoreID ); \
+ pxCurrentTCBs[ xCoreID ]->xTaskRunState = taskTASK_SCHEDULED_TO_YIELD; \
+ } \
+ } \
+ } while( 0 )
+#endif /* #if ( configNUMBER_OF_CORES > 1 ) */
+/*-----------------------------------------------------------*/
+
/*
* Task control block. A task control block (TCB) is allocated for each task,
* and stores task state information, including a pointer to the task's context
@@ -528,14 +553,6 @@ static BaseType_t prvCreateIdleTasks( void );
#if ( configNUMBER_OF_CORES > 1 )
/*
- * Yields the given core.
- */
- static void prvYieldCore( BaseType_t xCoreID );
-#endif /* #if ( configNUMBER_OF_CORES > 1 ) */
-
-#if ( configNUMBER_OF_CORES > 1 )
-
-/*
* Yields a core, or cores if multiple priorities are not allowed to run
* simultaneously, to allow the task pxTCB to run.
*/
@@ -812,33 +829,6 @@ static void prvAddNewTaskToReadyList( TCB_t * pxNewTCB ) PRIVILEGED_FUNCTION;
/*-----------------------------------------------------------*/
#if ( configNUMBER_OF_CORES > 1 )
- static void prvYieldCore( BaseType_t xCoreID )
- {
- /* This must be called from a critical section and xCoreID must be valid. */
- if( ( portCHECK_IF_IN_ISR() == pdTRUE ) && ( xCoreID == ( BaseType_t ) portGET_CORE_ID() ) )
- {
- xYieldPendings[ xCoreID ] = pdTRUE;
- }
- else
- {
- if( pxCurrentTCBs[ xCoreID ]->xTaskRunState != taskTASK_SCHEDULED_TO_YIELD )
- {
- if( xCoreID == ( BaseType_t ) portGET_CORE_ID() )
- {
- xYieldPendings[ xCoreID ] = pdTRUE;
- }
- else
- {
- portYIELD_CORE( xCoreID );
- pxCurrentTCBs[ xCoreID ]->xTaskRunState = taskTASK_SCHEDULED_TO_YIELD;
- }
- }
- }
- }
-#endif /* #if ( configNUMBER_OF_CORES > 1 ) */
-/*-----------------------------------------------------------*/
-
-#if ( configNUMBER_OF_CORES > 1 )
static void prvYieldForTask( const TCB_t * pxTCB )
{
BaseType_t xLowestPriorityToPreempt;