diff options
author | chinglee-iot <61685396+chinglee-iot@users.noreply.github.com> | 2023-10-04 14:33:28 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-10-04 14:33:28 +0300 |
commit | 30e13dac2bd97b7c1429cdead03406d94a83a042 (patch) | |
tree | 2caf4e7a27b1565e27e79bd91f945fa357ffaad6 /tasks.c | |
parent | 830533d49e70806b4f46dade245c2f05f0c06b0f (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.c | 60 |
1 files changed, 25 insertions, 35 deletions
@@ -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; |