Bläddra i källkod

freertos: Update task creation pinned to core functions

This commit updates the "xTaskCreate...PinnedToCore()" functions to
call the "xTaskCreate...AffinitySet()" equivalent functions.
Darian Leung 3 år sedan
förälder
incheckning
199df492b7

+ 3 - 2
components/freertos/FreeRTOS-Kernel-SMP/include/freertos/task.h

@@ -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 )

+ 3 - 7
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
 # 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
-- 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()`
 ### `vTaskSetThreadLocalStoragePointerAndDelCallback()`
 
 

+ 35 - 50
components/freertos/FreeRTOS-Kernel-SMP/tasks.c

@@ -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 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);
-        }
-        vTaskCoreAffinitySet(xTaskHandleTemp, uxCoreAffinityMask);
-        if (pvCreatedTask != NULL) {
-            *pvCreatedTask = xTaskHandleTemp;
+    #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);
         }
         }
-    }
-    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 ) */
+    #else /* ( ( configUSE_CORE_AFFINITY == 1 ) && ( configNUM_CORES > 1 ) ) */
+        {
+            ret = xTaskCreate(pxTaskCode, pcName, usStackDepth, pvParameters, uxPriority, pxCreatedTask);
+        }
+    #endif /* ( ( 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;
-#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);
-        }
-        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;
+    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);
+        }
+    #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 */
 #endif /* configSUPPORT_STATIC_ALLOCATION */