From 14ae22289aed68442c5f7959f2ced67c0bde665c Mon Sep 17 00:00:00 2001 From: rus084 Date: Tue, 12 May 2026 12:41:36 +0300 Subject: [PATCH] Add affinity to IDLE tasks in SMP systems --- examples/template_configuration/FreeRTOSConfig.h | 7 +++++++ include/FreeRTOS.h | 4 ++++ tasks.c | 7 ++++++- 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/examples/template_configuration/FreeRTOSConfig.h b/examples/template_configuration/FreeRTOSConfig.h index 7859a5c77f..b8c0e7f124 100644 --- a/examples/template_configuration/FreeRTOSConfig.h +++ b/examples/template_configuration/FreeRTOSConfig.h @@ -558,6 +558,13 @@ * tskNO_AFFINITY if left undefined. */ #define configTIMER_SERVICE_TASK_CORE_AFFINITY tskNO_AFFINITY +/* When using SMP (i.e. configNUMBER_OF_CORES is greater than one), set + * configIDLE_AFFINITY to 1 to pin each Idle task to its corresponding + * core. When set to 1, Idle task N will only run on core N, using an affinity + * mask of (1 << N). Set to 0 to allow the scheduler to run Idle tasks on any + * available core. Defaults to 0 if left undefined. */ +#define configIDLE_AFFINITY 0 + /******************************************************************************/ /* ARMv8-M secure side port related definitions. ******************************/ /******************************************************************************/ diff --git a/include/FreeRTOS.h b/include/FreeRTOS.h index 63e2feb519..83fd430bdc 100644 --- a/include/FreeRTOS.h +++ b/include/FreeRTOS.h @@ -377,6 +377,10 @@ #define configIDLE_SHOULD_YIELD 1 #endif +#ifndef configIDLE_AFFINITY + #define configIDLE_AFFINITY 0 +#endif + #if configMAX_TASK_NAME_LEN < 1 #error configMAX_TASK_NAME_LEN must be set to a minimum of 1 in FreeRTOSConfig.h #endif diff --git a/tasks.c b/tasks.c index c596c475f8..2523515cd6 100644 --- a/tasks.c +++ b/tasks.c @@ -3687,8 +3687,13 @@ static BaseType_t prvCreateIdleTasks( void ) /* Assign idle task to each core before SMP scheduler is running. */ xIdleTaskHandles[ xCoreID ]->xTaskRunState = xCoreID; pxCurrentTCBs[ xCoreID ] = xIdleTaskHandles[ xCoreID ]; + #if ( ( configIDLE_AFFINITY == 1 ) && ( configUSE_CORE_AFFINITY == 1 ) ) + { + xIdleTaskHandles[ xCoreID ]->uxCoreAffinityMask = ( ( UBaseType_t ) 1U << ( UBaseType_t ) xCoreID ); + } + #endif } - #endif + #endif /* if ( configNUMBER_OF_CORES == 1 ) */ } }