Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
147 changes: 144 additions & 3 deletions include/task.h
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,7 @@ typedef enum

/**
* Defines affinity to all available cores.
*
*
*/
#define tskNO_AFFINITY ( ( UBaseType_t ) -1U )

Expand Down Expand Up @@ -1244,11 +1244,152 @@ void vTaskResume( TaskHandle_t xTaskToResume ) PRIVILEGED_FUNCTION;
BaseType_t xTaskResumeFromISR( TaskHandle_t xTaskToResume ) PRIVILEGED_FUNCTION;

#if ( configUSE_CORE_AFFINITY == 1)
void vTaskCoreAffinitySet( const TaskHandle_t xTask, UBaseType_t uxCoreAffinityMask );
UBaseType_t vTaskCoreAffinityGet( const TaskHandle_t xTask );
/**
* @brief Sets the core affinity mask for a task.
*
* It sets the cores on which a task can run. configUSE_CORE_AFFINITY must
* be defined as 1 for this function to be available.
*
* @param xTask The handle of the task to set the core affinity mask for.
* Passing NULL will set the core affinity mask for the calling task.
*
* @param uxCoreAffinityMask A bitwise value that indicates the cores on
* which the task can run. Cores are numbered from 0 to configNUM_CORES - 1.
* For example, to ensure that a task can run on core 0 and core 1, set
* uxCoreAffinityMask to 0x03.
*
* Example usage:
*
* // The function that creates task.
* void vAFunction( void )
* {
* TaskHandle_t xHandle;
* UBaseType_t uxCoreAffinityMask;
*
* // Create a task, storing the handle.
* xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &( xHandle ) );
*
* // Define the core affinity mask such that this task can only run
* // on core 0 and core 2.
* uxCoreAffinityMask = ( ( 1 << 0 ) | ( 1 << 2 ) );
*
* //Set the core affinity mask for the task.
* vTaskCoreAffinitySet( xHandle, uxCoreAffinityMask );
* }
*/
void vTaskCoreAffinitySet( const TaskHandle_t xTask, UBaseType_t uxCoreAffinityMask );
#endif

#if ( configUSE_CORE_AFFINITY == 1)
/**
* @brief Gets the core affinity mask for a task.
*
* configUSE_CORE_AFFINITY must be defined as 1 for this function to be
* available.
*
* @param xTask The handle of the task to get the core affinity mask for.
* Passing NULL will get the core affinity mask for the calling task.
*
* @return The core affinity mask which is a bitwise value that indicates
* the cores on which a task can run. Cores are numbered from 0 to
* configNUM_CORES - 1. For example, if a task can run on core 0 and core 1,
* the core affinity mask is 0x03.
*
* Example usage:
*
* // Task handle of the networking task - it is populated elsewhere.
* TaskHandle_t xNetworkingTaskHandle;
*
* void vAFunction( void )
* {
* TaskHandle_t xHandle;
* UBaseType_t uxNetworkingCoreAffinityMask;
*
* // Create a task, storing the handle.
* xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &( xHandle ) );
*
* //Get the core affinity mask for the networking task.
* uxNetworkingCoreAffinityMask = vTaskCoreAffinityGet( xNetworkingTaskHandle );
*
* // Here is a hypothetical scenario, just for the example. Assume that we
* // have 2 cores - Core 0 and core 1. We want to pin the application task to
* // the core different than the networking task to ensure that the
* // application task does not interfere with networking.
* if( ( uxNetworkingCoreAffinityMask & ( 1 << 0 ) ) != 0 )
* {
* // The networking task can run on core 0, pin our task to core 1.
* vTaskCoreAffinitySet( xHandle, ( 1 << 1 ) );
* }
* else
* {
* // Otherwise, pin our task to core 0.
* vTaskCoreAffinitySet( xHandle, ( 1 << 0 ) );
* }
* }
*/
UBaseType_t vTaskCoreAffinityGet( const TaskHandle_t xTask );
#endif

/**
* @brief Disables preemption for a task.
*
* @param xTask The handle of the task to disable preemption. Passing NULL
* disables preemption for the calling task.
*
* Example usage:
*
* void vTaskCode( void *pvParameters )
* {
* // Silence warnings about unused parameters.
* ( void ) pvParameters;
*
* for( ;; )
* {
* // ... Perform some function here.
*
* // Disable preemption for this task.
* vTaskPreemptionDisable( NULL );
*
* // The task will not be preempted when it is executing in this portion ...
*
* // ... until the preemption is enabled again.
* vTaskPreemptionEnable( NULL );
*
* // The task can be preempted when it is executing in this portion.
* }
* }
*/
void vTaskPreemptionDisable( const TaskHandle_t xTask );

/**
* @brief Enables preemption for a task.
*
* @param xTask The handle of the task to enable preemption. Passing NULL
* enables preemption for the calling task.
*
* Example usage:
*
* void vTaskCode( void *pvParameters )
* {
* // Silence warnings about unused parameters.
* ( void ) pvParameters;
*
* for( ;; )
* {
* // ... Perform some function here.
*
* // Disable preemption for this task.
* vTaskPreemptionDisable( NULL );
*
* // The task will not be preempted when it is executing in this portion ...
*
* // ... until the preemption is enabled again.
* vTaskPreemptionEnable( NULL );
*
* // The task can be preempted when it is executing in this portion.
* }
* }
*/
void vTaskPreemptionEnable( const TaskHandle_t xTask );

/*-----------------------------------------------------------
Expand Down
2 changes: 0 additions & 2 deletions tasks.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,6 @@
* task.h is included from an application file. */
#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE

#define DEBUG_UNIT FREERTOS_TASKS

/* FreeRTOS includes. */
#include "FreeRTOS.h"
#include "task.h"
Expand Down