Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/FreeRTOS/FreeRTOS-Kernel.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDarian <32921628+Dazza0@users.noreply.github.com>2022-03-18 20:16:21 +0300
committerGitHub <noreply@github.com>2022-03-18 20:16:21 +0300
commita97741a08d36ac08d913b8bc86abf128df627e85 (patch)
tree05cb8098b6862b16bdce42e4080edfb38eb0b9ae
parent4446c8f0ea97707bdf12c403ab7d7fdbdd061418 (diff)
Add task creation with affinity functions (#470)
This commit adds the functions listed below. These functions allow tasks to be created with their core affinity already set. - xTaskCreateAffinitySet() - xTaskCreateStaticAffinitySet() - xTaskCreateRestrictedAffinitySet() - xTaskCreateRestrictedStaticAffinitySet()
-rw-r--r--include/task.h33
-rw-r--r--tasks.c75
2 files changed, 108 insertions, 0 deletions
diff --git a/include/task.h b/include/task.h
index 64fdd7a9f..65cd86e8d 100644
--- a/include/task.h
+++ b/include/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
* <pre>
@@ -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
* <pre>
@@ -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
* <pre>
@@ -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
* <pre>
diff --git a/tasks.c b/tasks.c
index 82133ebdf..4296e300b 100644
--- a/tasks.c
+++ b/tasks.c
@@ -1060,6 +1060,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;
@@ -1094,6 +1108,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
@@ -1111,6 +1133,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;
@@ -1144,6 +1175,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;
}
@@ -1158,6 +1196,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;
@@ -1193,6 +1240,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;
}
@@ -1212,6 +1266,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;
@@ -1283,6 +1350,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;
}