mirror of
https://github.com/FreeRTOS/FreeRTOS-Kernel.git
synced 2025-04-20 05:21:59 -04:00
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()
This commit is contained in:
parent
4446c8f0ea
commit
a97741a08d
|
@ -380,6 +380,16 @@ typedef enum
|
||||||
TaskHandle_t * const pxCreatedTask ) PRIVILEGED_FUNCTION;
|
TaskHandle_t * const pxCreatedTask ) PRIVILEGED_FUNCTION;
|
||||||
#endif
|
#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
|
* task. h
|
||||||
* <pre>
|
* <pre>
|
||||||
|
@ -498,6 +508,17 @@ typedef enum
|
||||||
StaticTask_t * const pxTaskBuffer ) PRIVILEGED_FUNCTION;
|
StaticTask_t * const pxTaskBuffer ) PRIVILEGED_FUNCTION;
|
||||||
#endif /* configSUPPORT_STATIC_ALLOCATION */
|
#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
|
* task. h
|
||||||
* <pre>
|
* <pre>
|
||||||
|
@ -576,6 +597,12 @@ typedef enum
|
||||||
TaskHandle_t * pxCreatedTask ) PRIVILEGED_FUNCTION;
|
TaskHandle_t * pxCreatedTask ) PRIVILEGED_FUNCTION;
|
||||||
#endif
|
#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
|
* task. h
|
||||||
* <pre>
|
* <pre>
|
||||||
|
@ -666,6 +693,12 @@ typedef enum
|
||||||
TaskHandle_t * pxCreatedTask ) PRIVILEGED_FUNCTION;
|
TaskHandle_t * pxCreatedTask ) PRIVILEGED_FUNCTION;
|
||||||
#endif
|
#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
|
* task. h
|
||||||
* <pre>
|
* <pre>
|
||||||
|
|
75
tasks.c
75
tasks.c
|
@ -1060,6 +1060,20 @@ static void prvYieldForTask( TCB_t * pxTCB,
|
||||||
UBaseType_t uxPriority,
|
UBaseType_t uxPriority,
|
||||||
StackType_t * const puxStackBuffer,
|
StackType_t * const puxStackBuffer,
|
||||||
StaticTask_t * const pxTaskBuffer )
|
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;
|
TCB_t * pxNewTCB;
|
||||||
TaskHandle_t xReturn;
|
TaskHandle_t xReturn;
|
||||||
|
@ -1094,6 +1108,14 @@ static void prvYieldForTask( TCB_t * pxTCB,
|
||||||
#endif /* tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE */
|
#endif /* tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE */
|
||||||
|
|
||||||
prvInitialiseNewTask( pxTaskCode, pcName, ulStackDepth, pvParameters, uxPriority, &xReturn, pxNewTCB, NULL );
|
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 );
|
prvAddNewTaskToReadyList( pxNewTCB );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -1111,6 +1133,15 @@ static void prvYieldForTask( TCB_t * pxTCB,
|
||||||
|
|
||||||
BaseType_t xTaskCreateRestrictedStatic( const TaskParameters_t * const pxTaskDefinition,
|
BaseType_t xTaskCreateRestrictedStatic( const TaskParameters_t * const pxTaskDefinition,
|
||||||
TaskHandle_t * pxCreatedTask )
|
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;
|
TCB_t * pxNewTCB;
|
||||||
BaseType_t xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY;
|
BaseType_t xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY;
|
||||||
|
@ -1144,6 +1175,13 @@ static void prvYieldForTask( TCB_t * pxTCB,
|
||||||
pxCreatedTask, pxNewTCB,
|
pxCreatedTask, pxNewTCB,
|
||||||
pxTaskDefinition->xRegions );
|
pxTaskDefinition->xRegions );
|
||||||
|
|
||||||
|
#if ( ( configNUM_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) )
|
||||||
|
{
|
||||||
|
/* Set the task's affinity before scheduling it */
|
||||||
|
pxNewTCB->uxCoreAffinityMask = uxCoreAffinityMask;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
prvAddNewTaskToReadyList( pxNewTCB );
|
prvAddNewTaskToReadyList( pxNewTCB );
|
||||||
xReturn = pdPASS;
|
xReturn = pdPASS;
|
||||||
}
|
}
|
||||||
|
@ -1158,6 +1196,15 @@ static void prvYieldForTask( TCB_t * pxTCB,
|
||||||
|
|
||||||
BaseType_t xTaskCreateRestricted( const TaskParameters_t * const pxTaskDefinition,
|
BaseType_t xTaskCreateRestricted( const TaskParameters_t * const pxTaskDefinition,
|
||||||
TaskHandle_t * pxCreatedTask )
|
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;
|
TCB_t * pxNewTCB;
|
||||||
BaseType_t xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY;
|
BaseType_t xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY;
|
||||||
|
@ -1193,6 +1240,13 @@ static void prvYieldForTask( TCB_t * pxTCB,
|
||||||
pxCreatedTask, pxNewTCB,
|
pxCreatedTask, pxNewTCB,
|
||||||
pxTaskDefinition->xRegions );
|
pxTaskDefinition->xRegions );
|
||||||
|
|
||||||
|
#if ( ( configNUM_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) )
|
||||||
|
{
|
||||||
|
/* Set the task's affinity before scheduling it */
|
||||||
|
pxNewTCB->uxCoreAffinityMask = uxCoreAffinityMask;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
prvAddNewTaskToReadyList( pxNewTCB );
|
prvAddNewTaskToReadyList( pxNewTCB );
|
||||||
xReturn = pdPASS;
|
xReturn = pdPASS;
|
||||||
}
|
}
|
||||||
|
@ -1212,6 +1266,19 @@ static void prvYieldForTask( TCB_t * pxTCB,
|
||||||
void * const pvParameters,
|
void * const pvParameters,
|
||||||
UBaseType_t uxPriority,
|
UBaseType_t uxPriority,
|
||||||
TaskHandle_t * const pxCreatedTask )
|
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;
|
TCB_t * pxNewTCB;
|
||||||
BaseType_t xReturn;
|
BaseType_t xReturn;
|
||||||
|
@ -1283,6 +1350,14 @@ static void prvYieldForTask( TCB_t * pxTCB,
|
||||||
#endif /* tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE */
|
#endif /* tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE */
|
||||||
|
|
||||||
prvInitialiseNewTask( pxTaskCode, pcName, ( uint32_t ) usStackDepth, pvParameters, uxPriority, pxCreatedTask, pxNewTCB, NULL );
|
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 );
|
prvAddNewTaskToReadyList( pxNewTCB );
|
||||||
xReturn = pdPASS;
|
xReturn = pdPASS;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue