diff --git a/components/freertos/FreeRTOS-Kernel-SMP/include/freertos/task.h b/components/freertos/FreeRTOS-Kernel-SMP/include/freertos/task.h index be2e41d9c2..e51e169fd9 100644 --- a/components/freertos/FreeRTOS-Kernel-SMP/include/freertos/task.h +++ b/components/freertos/FreeRTOS-Kernel-SMP/include/freertos/task.h @@ -380,6 +380,16 @@ typedef enum TaskHandle_t * const pxCreatedTask ) PRIVILEGED_FUNCTION; #endif +#if ( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configNUM_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) ) + BaseType_t xTaskCreateAffinitySet( TaskFunction_t pxTaskCode, + const char * const pcName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + const configSTACK_DEPTH_TYPE usStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + UBaseType_t uxCoreAffinityMask, + TaskHandle_t * const pxCreatedTask ) PRIVILEGED_FUNCTION; +#endif + /** * task. h *
@@ -498,6 +508,17 @@ typedef enum StaticTask_t * const pxTaskBuffer ) PRIVILEGED_FUNCTION; #endif /* configSUPPORT_STATIC_ALLOCATION */ +#if ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configNUM_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) ) + TaskHandle_t xTaskCreateStaticAffinitySet( TaskFunction_t pxTaskCode, + const char * const pcName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + const uint32_t ulStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + StackType_t * const puxStackBuffer, + StaticTask_t * const pxTaskBuffer, + UBaseType_t uxCoreAffinityMask ) PRIVILEGED_FUNCTION; +#endif + /** * task. h *@@ -576,6 +597,12 @@ typedef enum TaskHandle_t * pxCreatedTask ) PRIVILEGED_FUNCTION; #endif +#if ( ( portUSING_MPU_WRAPPERS == 1 ) && ( configNUM_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) ) + BaseType_t xTaskCreateRestrictedAffinitySet( const TaskParameters_t * const pxTaskDefinition, + UBaseType_t uxCoreAffinityMask, + TaskHandle_t * pxCreatedTask ) PRIVILEGED_FUNCTION; +#endif + /** * task. h *@@ -666,6 +693,12 @@ typedef enum TaskHandle_t * pxCreatedTask ) PRIVILEGED_FUNCTION; #endif +#if ( ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configNUM_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) ) + BaseType_t xTaskCreateRestrictedStaticAffinitySet( const TaskParameters_t * const pxTaskDefinition, + UBaseType_t uxCoreAffinityMask, + TaskHandle_t * pxCreatedTask ) PRIVILEGED_FUNCTION; +#endif + /** * task. h *@@ -3245,12 +3278,13 @@ void vTaskYieldWithinAPI( void ); * ------------------------------------------------------------------------------------------------------------------ */ #ifdef ESP_PLATFORM -BaseType_t xTaskCreatePinnedToCore( TaskFunction_t pvTaskCode, + +BaseType_t xTaskCreatePinnedToCore( TaskFunction_t pxTaskCode, const char * const pcName, const uint32_t usStackDepth, void * const pvParameters, UBaseType_t uxPriority, - TaskHandle_t * const pvCreatedTask, + TaskHandle_t * const pxCreatedTask, const BaseType_t xCoreID); #if ( configSUPPORT_STATIC_ALLOCATION == 1 ) diff --git a/components/freertos/FreeRTOS-Kernel-SMP/porting_notes.md b/components/freertos/FreeRTOS-Kernel-SMP/porting_notes.md index 10a7893515..0498ad579d 100644 --- a/components/freertos/FreeRTOS-Kernel-SMP/porting_notes.md +++ b/components/freertos/FreeRTOS-Kernel-SMP/porting_notes.md @@ -9,7 +9,7 @@ The following terms will be used in this document to avoid confusion between the # Organization -This directory contains a copy of SMP FreeRTOS based off of upstream commit [483237711](https://github.com/FreeRTOS/FreeRTOS-Kernel/commit/4832377117b4198db43009f2b548497d9cdbf8da) +This directory contains a copy of SMP FreeRTOS based off of upstream commit [a97741a](https://github.com/FreeRTOS/FreeRTOS-Kernel/commit/a97741a08d36ac08d913b8bc86abf128df627e85) - IDF FreeRTOS remains in `components/freertos/FreeRTOS-Kernel` - SMP FreeRTOS is entirely contained in `components/freertos/FreeRTOS-Kernel-SMP` @@ -143,12 +143,8 @@ IDF FreeRTOS added several APIs. These are copied over to SMP FreeRTOS to mainta ### `xTaskCreatePinnedToCore()`/`xTaskCreateStaticPinnedToCore()` -- Used to create a task with a preset affinity on creation -- When a task can only run on a particular core, this function saves the need of adding logic to: - - Disabling preemption on all cores - - Setting the created task's affinity - - Reenabling preemption on all cores. -- Check if this (or something similar) can be upstreamed +- `xTaskCreate...AffinitySet()` have been upstreamed +- `xTaskCreate...PinnedToCore()` now just map to the `xTaskCreate...AffinitySet()` equivalent functions. ### `vTaskSetThreadLocalStoragePointerAndDelCallback()` diff --git a/components/freertos/FreeRTOS-Kernel-SMP/tasks.c b/components/freertos/FreeRTOS-Kernel-SMP/tasks.c index 1017bed41c..7e2f5e1263 100644 --- a/components/freertos/FreeRTOS-Kernel-SMP/tasks.c +++ b/components/freertos/FreeRTOS-Kernel-SMP/tasks.c @@ -1071,6 +1071,20 @@ static void prvYieldForTask( TCB_t * pxTCB, UBaseType_t uxPriority, StackType_t * const puxStackBuffer, StaticTask_t * const pxTaskBuffer ) + #if ( ( configNUM_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) ) + { + return xTaskCreateStaticAffinitySet(pxTaskCode, pcName, ulStackDepth, pvParameters, uxPriority, puxStackBuffer, pxTaskBuffer, tskNO_AFFINITY); + } + + TaskHandle_t xTaskCreateStaticAffinitySet( TaskFunction_t pxTaskCode, + const char * const pcName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + const uint32_t ulStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + StackType_t * const puxStackBuffer, + StaticTask_t * const pxTaskBuffer, + UBaseType_t uxCoreAffinityMask ) + #endif /* ( configNUM_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) */ { TCB_t * pxNewTCB; TaskHandle_t xReturn; @@ -1105,6 +1119,14 @@ static void prvYieldForTask( TCB_t * pxTCB, #endif /* tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE */ prvInitialiseNewTask( pxTaskCode, pcName, ulStackDepth, pvParameters, uxPriority, &xReturn, pxNewTCB, NULL ); + + #if ( ( configNUM_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) ) + { + /* Set the task's affinity before scheduling it */ + pxNewTCB->uxCoreAffinityMask = uxCoreAffinityMask; + } + #endif + prvAddNewTaskToReadyList( pxNewTCB ); } else @@ -1122,6 +1144,15 @@ static void prvYieldForTask( TCB_t * pxTCB, BaseType_t xTaskCreateRestrictedStatic( const TaskParameters_t * const pxTaskDefinition, TaskHandle_t * pxCreatedTask ) + #if ( ( configNUM_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) ) + { + return xTaskCreateRestrictedStaticAffinitySet( pxTaskDefinition, tskNO_AFFINITY, pxCreatedTask ); + } + + BaseType_t xTaskCreateRestrictedStaticAffinitySet( const TaskParameters_t * const pxTaskDefinition, + UBaseType_t uxCoreAffinityMask, + TaskHandle_t * pxCreatedTask ) + #endif /* ( configNUM_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) */ { TCB_t * pxNewTCB; BaseType_t xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY; @@ -1155,6 +1186,13 @@ static void prvYieldForTask( TCB_t * pxTCB, pxCreatedTask, pxNewTCB, pxTaskDefinition->xRegions ); + #if ( ( configNUM_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) ) + { + /* Set the task's affinity before scheduling it */ + pxNewTCB->uxCoreAffinityMask = uxCoreAffinityMask; + } + #endif + prvAddNewTaskToReadyList( pxNewTCB ); xReturn = pdPASS; } @@ -1169,6 +1207,15 @@ static void prvYieldForTask( TCB_t * pxTCB, BaseType_t xTaskCreateRestricted( const TaskParameters_t * const pxTaskDefinition, TaskHandle_t * pxCreatedTask ) + #if ( ( configNUM_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) ) + { + return xTaskCreateRestrictedAffinitySet( pxTaskDefinition, tskNO_AFFINITY, pxCreatedTask ); + } + + BaseType_t xTaskCreateRestrictedAffinitySet( const TaskParameters_t * const pxTaskDefinition, + UBaseType_t uxCoreAffinityMask, + TaskHandle_t * pxCreatedTask ) + #endif /* ( configNUM_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) */ { TCB_t * pxNewTCB; BaseType_t xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY; @@ -1204,6 +1251,13 @@ static void prvYieldForTask( TCB_t * pxTCB, pxCreatedTask, pxNewTCB, pxTaskDefinition->xRegions ); + #if ( ( configNUM_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) ) + { + /* Set the task's affinity before scheduling it */ + pxNewTCB->uxCoreAffinityMask = uxCoreAffinityMask; + } + #endif + prvAddNewTaskToReadyList( pxNewTCB ); xReturn = pdPASS; } @@ -1223,6 +1277,19 @@ static void prvYieldForTask( TCB_t * pxTCB, void * const pvParameters, UBaseType_t uxPriority, TaskHandle_t * const pxCreatedTask ) + #if ( ( configNUM_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) ) + { + return xTaskCreateAffinitySet(pxTaskCode, pcName, usStackDepth, pvParameters, uxPriority, tskNO_AFFINITY, pxCreatedTask); + } + + BaseType_t xTaskCreateAffinitySet( TaskFunction_t pxTaskCode, + const char * const pcName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + const configSTACK_DEPTH_TYPE usStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + UBaseType_t uxCoreAffinityMask, + TaskHandle_t * const pxCreatedTask ) + #endif /* ( configNUM_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) */ { TCB_t * pxNewTCB; BaseType_t xReturn; @@ -1294,6 +1361,14 @@ static void prvYieldForTask( TCB_t * pxTCB, #endif /* tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE */ prvInitialiseNewTask( pxTaskCode, pcName, ( uint32_t ) usStackDepth, pvParameters, uxPriority, pxCreatedTask, pxNewTCB, NULL ); + + #if ( ( configNUM_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) ) + { + /* Set the task's affinity before scheduling it */ + pxNewTCB->uxCoreAffinityMask = uxCoreAffinityMask; + } + #endif + prvAddNewTaskToReadyList( pxNewTCB ); xReturn = pdPASS; } @@ -6400,41 +6475,31 @@ static void prvAddCurrentTaskToDelayedList( TickType_t xTicksToWait, #ifdef ESP_PLATFORM -BaseType_t xTaskCreatePinnedToCore( TaskFunction_t pvTaskCode, +BaseType_t xTaskCreatePinnedToCore( TaskFunction_t pxTaskCode, const char * const pcName, const uint32_t usStackDepth, void * const pvParameters, UBaseType_t uxPriority, - TaskHandle_t * const pvCreatedTask, + TaskHandle_t * const pxCreatedTask, const BaseType_t xCoreID) { BaseType_t ret; -#if ( configUSE_CORE_AFFINITY == 1 && configNUM_CORES > 1 ) - /* - If we are using multiple cores and core affinity, we need to create the task then set the core affinity of that - task. We do this with interrupts disabled to prevent the task from being scehduled immediately after - xTaskCreate(). - */ - portDISABLE_INTERRUPTS(); - TaskHandle_t xTaskHandleTemp; - ret = xTaskCreate(pvTaskCode, pcName, usStackDepth, pvParameters, uxPriority, &xTaskHandleTemp); - if (ret == pdPASS) { - UBaseType_t uxCoreAffinityMask; - if (xCoreID == tskNO_AFFINITY) { - uxCoreAffinityMask = tskNO_AFFINITY; - } else { - uxCoreAffinityMask = (1 << xCoreID); + #if ( ( configUSE_CORE_AFFINITY == 1 ) && ( configNUM_CORES > 1 ) ) + { + // Convert xCoreID into an affinity mask + UBaseType_t uxCoreAffinityMask; + if (xCoreID == tskNO_AFFINITY) { + uxCoreAffinityMask = tskNO_AFFINITY; + } else { + uxCoreAffinityMask = (1 << xCoreID); + } + ret = xTaskCreateAffinitySet(pxTaskCode, pcName, usStackDepth, pvParameters, uxPriority, uxCoreAffinityMask, pxCreatedTask); } - vTaskCoreAffinitySet(xTaskHandleTemp, uxCoreAffinityMask); - if (pvCreatedTask != NULL) { - *pvCreatedTask = xTaskHandleTemp; + #else /* ( ( configUSE_CORE_AFFINITY == 1 ) && ( configNUM_CORES > 1 ) ) */ + { + ret = xTaskCreate(pxTaskCode, pcName, usStackDepth, pvParameters, uxPriority, pxCreatedTask); } - } - portENABLE_INTERRUPTS(); -#else /* if ( configUSE_CORE_AFFINITY == 1 && configNUM_CORES > 1 ) */ - //No need to set the affinity. Just create the task - ret = xTaskCreate(pvTaskCode, pcName, usStackDepth, pvParameters, uxPriority, pvCreatedTask); -#endif /* if ( configUSE_CORE_AFFINITY == 1 && configNUM_CORES > 1 ) */ + #endif /* ( ( configUSE_CORE_AFFINITY == 1 ) && ( configNUM_CORES > 1 ) ) */ return ret; } @@ -6448,29 +6513,24 @@ TaskHandle_t xTaskCreateStaticPinnedToCore( TaskFunction_t pxTaskCode, StaticTask_t * const pxTaskBuffer, const BaseType_t xCoreID) { - TaskHandle_t xTaskHandleTemp; -#if ( configUSE_CORE_AFFINITY == 1 && configNUM_CORES > 1 ) - /* - If we are using multiple cores and core affinity, we need to create the task then set the core affinity of that - task. We do this with interrupts disabled to prevent the task from being scehduled immediately after - xTaskCreate(). - */ - portDISABLE_INTERRUPTS(); - xTaskHandleTemp = xTaskCreateStatic(pxTaskCode, pcName, ulStackDepth, pvParameters, uxPriority, puxStackBuffer, pxTaskBuffer); - if (xTaskHandleTemp != NULL) { - UBaseType_t uxCoreAffinityMask; - if (xCoreID == tskNO_AFFINITY) { - uxCoreAffinityMask = tskNO_AFFINITY; - } else { - uxCoreAffinityMask = (1 << xCoreID); + BaseType_t ret; + #if ( ( configUSE_CORE_AFFINITY == 1 ) && ( configNUM_CORES > 1 ) ) + { + // Convert xCoreID into an affinity mask + UBaseType_t uxCoreAffinityMask; + if (xCoreID == tskNO_AFFINITY) { + uxCoreAffinityMask = tskNO_AFFINITY; + } else { + uxCoreAffinityMask = (1 << xCoreID); + } + ret = xTaskCreateStaticAffinitySet(pxTaskCode, pcName, ulStackDepth, pvParameters, uxPriority, puxStackBuffer, pxTaskBuffer, uxCoreAffinityMask); } - vTaskCoreAffinitySet(xTaskHandleTemp, uxCoreAffinityMask); - } - portENABLE_INTERRUPTS(); -#else /* if ( configUSE_CORE_AFFINITY == 1 && configNUM_CORES > 1 ) */ - xTaskHandleTemp = xTaskCreateStatic(pxTaskCode, pcName, ulStackDepth, pvParameters, uxPriority, puxStackBuffer, pxTaskBuffer); -#endif /* if ( configUSE_CORE_AFFINITY == 1 && configNUM_CORES > 1 ) */ - return xTaskHandleTemp; + #else /* ( ( configUSE_CORE_AFFINITY == 1 ) && ( configNUM_CORES > 1 ) ) */ + { + ret = xTaskCreateStatic(pxTaskCode, pcName, ulStackDepth, pvParameters, uxPriority, puxStackBuffer, pxTaskBuffer); + } + #endif /* ( ( configUSE_CORE_AFFINITY == 1 ) && ( configNUM_CORES > 1 ) ) */ + return ret; } #endif /* configSUPPORT_STATIC_ALLOCATION */