mirror of
				https://github.com/FreeRTOS/FreeRTOS-Kernel.git
				synced 2025-11-04 02:32:42 -05: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
					
				
					 2 changed files with 108 additions and 0 deletions
				
			
		| 
						 | 
					@ -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…
	
	Add table
		Add a link
		
	
		Reference in a new issue