freertos: Update task creation pinned to core functions

This commit updates the "xTaskCreate...PinnedToCore()" functions to
call the "xTaskCreate...AffinitySet()" equivalent functions.
This commit is contained in:
Darian Leung 2022-03-21 11:37:21 +08:00
parent 6a38499172
commit 199df492b7
3 changed files with 39 additions and 57 deletions

View File

@ -3278,12 +3278,13 @@ void vTaskYieldWithinAPI( void );
* ------------------------------------------------------------------------------------------------------------------ */ * ------------------------------------------------------------------------------------------------------------------ */
#ifdef ESP_PLATFORM #ifdef ESP_PLATFORM
BaseType_t xTaskCreatePinnedToCore( TaskFunction_t pvTaskCode,
BaseType_t xTaskCreatePinnedToCore( TaskFunction_t pxTaskCode,
const char * const pcName, const char * const pcName,
const uint32_t usStackDepth, const uint32_t usStackDepth,
void * const pvParameters, void * const pvParameters,
UBaseType_t uxPriority, UBaseType_t uxPriority,
TaskHandle_t * const pvCreatedTask, TaskHandle_t * const pxCreatedTask,
const BaseType_t xCoreID); const BaseType_t xCoreID);
#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) #if ( configSUPPORT_STATIC_ALLOCATION == 1 )

View File

@ -9,7 +9,7 @@ The following terms will be used in this document to avoid confusion between the
# Organization # 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` - IDF FreeRTOS remains in `components/freertos/FreeRTOS-Kernel`
- SMP FreeRTOS is entirely contained in `components/freertos/FreeRTOS-Kernel-SMP` - 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()` ### `xTaskCreatePinnedToCore()`/`xTaskCreateStaticPinnedToCore()`
- Used to create a task with a preset affinity on creation - `xTaskCreate...AffinitySet()` have been upstreamed
- When a task can only run on a particular core, this function saves the need of adding logic to: - `xTaskCreate...PinnedToCore()` now just map to the `xTaskCreate...AffinitySet()` equivalent functions.
- 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
### `vTaskSetThreadLocalStoragePointerAndDelCallback()` ### `vTaskSetThreadLocalStoragePointerAndDelCallback()`

View File

@ -6475,41 +6475,31 @@ static void prvAddCurrentTaskToDelayedList( TickType_t xTicksToWait,
#ifdef ESP_PLATFORM #ifdef ESP_PLATFORM
BaseType_t xTaskCreatePinnedToCore( TaskFunction_t pvTaskCode, BaseType_t xTaskCreatePinnedToCore( TaskFunction_t pxTaskCode,
const char * const pcName, const char * const pcName,
const uint32_t usStackDepth, const uint32_t usStackDepth,
void * const pvParameters, void * const pvParameters,
UBaseType_t uxPriority, UBaseType_t uxPriority,
TaskHandle_t * const pvCreatedTask, TaskHandle_t * const pxCreatedTask,
const BaseType_t xCoreID) const BaseType_t xCoreID)
{ {
BaseType_t ret; BaseType_t ret;
#if ( configUSE_CORE_AFFINITY == 1 && configNUM_CORES > 1 ) #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 // Convert xCoreID into an affinity mask
task. We do this with interrupts disabled to prevent the task from being scehduled immediately after UBaseType_t uxCoreAffinityMask;
xTaskCreate(). if (xCoreID == tskNO_AFFINITY) {
*/ uxCoreAffinityMask = tskNO_AFFINITY;
portDISABLE_INTERRUPTS(); } else {
TaskHandle_t xTaskHandleTemp; uxCoreAffinityMask = (1 << xCoreID);
ret = xTaskCreate(pvTaskCode, pcName, usStackDepth, pvParameters, uxPriority, &xTaskHandleTemp); }
if (ret == pdPASS) { ret = xTaskCreateAffinitySet(pxTaskCode, pcName, usStackDepth, pvParameters, uxPriority, uxCoreAffinityMask, pxCreatedTask);
UBaseType_t uxCoreAffinityMask;
if (xCoreID == tskNO_AFFINITY) {
uxCoreAffinityMask = tskNO_AFFINITY;
} else {
uxCoreAffinityMask = (1 << xCoreID);
} }
vTaskCoreAffinitySet(xTaskHandleTemp, uxCoreAffinityMask); #else /* ( ( configUSE_CORE_AFFINITY == 1 ) && ( configNUM_CORES > 1 ) ) */
if (pvCreatedTask != NULL) { {
*pvCreatedTask = xTaskHandleTemp; ret = xTaskCreate(pxTaskCode, pcName, usStackDepth, pvParameters, uxPriority, pxCreatedTask);
} }
} #endif /* ( ( configUSE_CORE_AFFINITY == 1 ) && ( configNUM_CORES > 1 ) ) */
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 ) */
return ret; return ret;
} }
@ -6523,29 +6513,24 @@ TaskHandle_t xTaskCreateStaticPinnedToCore( TaskFunction_t pxTaskCode,
StaticTask_t * const pxTaskBuffer, StaticTask_t * const pxTaskBuffer,
const BaseType_t xCoreID) const BaseType_t xCoreID)
{ {
TaskHandle_t xTaskHandleTemp; BaseType_t ret;
#if ( configUSE_CORE_AFFINITY == 1 && configNUM_CORES > 1 ) #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 // Convert xCoreID into an affinity mask
task. We do this with interrupts disabled to prevent the task from being scehduled immediately after UBaseType_t uxCoreAffinityMask;
xTaskCreate(). if (xCoreID == tskNO_AFFINITY) {
*/ uxCoreAffinityMask = tskNO_AFFINITY;
portDISABLE_INTERRUPTS(); } else {
xTaskHandleTemp = xTaskCreateStatic(pxTaskCode, pcName, ulStackDepth, pvParameters, uxPriority, puxStackBuffer, pxTaskBuffer); uxCoreAffinityMask = (1 << xCoreID);
if (xTaskHandleTemp != NULL) { }
UBaseType_t uxCoreAffinityMask; ret = xTaskCreateStaticAffinitySet(pxTaskCode, pcName, ulStackDepth, pvParameters, uxPriority, puxStackBuffer, pxTaskBuffer, uxCoreAffinityMask);
if (xCoreID == tskNO_AFFINITY) {
uxCoreAffinityMask = tskNO_AFFINITY;
} else {
uxCoreAffinityMask = (1 << xCoreID);
} }
vTaskCoreAffinitySet(xTaskHandleTemp, uxCoreAffinityMask); #else /* ( ( configUSE_CORE_AFFINITY == 1 ) && ( configNUM_CORES > 1 ) ) */
} {
portENABLE_INTERRUPTS(); ret = xTaskCreateStatic(pxTaskCode, pcName, ulStackDepth, pvParameters, uxPriority, puxStackBuffer, pxTaskBuffer);
#else /* if ( configUSE_CORE_AFFINITY == 1 && configNUM_CORES > 1 ) */ }
xTaskHandleTemp = xTaskCreateStatic(pxTaskCode, pcName, ulStackDepth, pvParameters, uxPriority, puxStackBuffer, pxTaskBuffer); #endif /* ( ( configUSE_CORE_AFFINITY == 1 ) && ( configNUM_CORES > 1 ) ) */
#endif /* if ( configUSE_CORE_AFFINITY == 1 && configNUM_CORES > 1 ) */ return ret;
return xTaskHandleTemp;
} }
#endif /* configSUPPORT_STATIC_ALLOCATION */ #endif /* configSUPPORT_STATIC_ALLOCATION */