diff --git a/components/freertos/FreeRTOS-Kernel-SMP/include/freertos/task.h b/components/freertos/FreeRTOS-Kernel-SMP/include/freertos/task.h index 4c821abbcf..e51e169fd9 100644 --- a/components/freertos/FreeRTOS-Kernel-SMP/include/freertos/task.h +++ b/components/freertos/FreeRTOS-Kernel-SMP/include/freertos/task.h @@ -3278,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 2462002cce..7e2f5e1263 100644 --- a/components/freertos/FreeRTOS-Kernel-SMP/tasks.c +++ b/components/freertos/FreeRTOS-Kernel-SMP/tasks.c @@ -6475,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; } @@ -6523,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 */