mirror of
				https://github.com/FreeRTOS/FreeRTOS-Kernel.git
				synced 2025-11-04 11:09:01 +01: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;
 | 
			
		||||
#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>
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										75
									
								
								tasks.c
									
									
									
									
									
								
							
							
						
						
									
										75
									
								
								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;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user