From f7565c2d5e4b88a7d8ab2816834c6e6274b34234 Mon Sep 17 00:00:00 2001 From: chinglee-iot <61685396+chinglee-iot@users.noreply.github.com> Date: Wed, 6 Sep 2023 19:09:52 +0800 Subject: [PATCH] Add configUSE_CORE_AFFINITY bits check (#776) * Add core affinity bits check * Add taskBITS_PER_BYTES --- include/FreeRTOS.h | 4 ++++ tasks.c | 12 +++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/include/FreeRTOS.h b/include/FreeRTOS.h index 1a6468b18..980c9d0f8 100644 --- a/include/FreeRTOS.h +++ b/include/FreeRTOS.h @@ -1165,6 +1165,10 @@ #error configUSE_TASK_PREEMPTION_DISABLE is not supported in single core FreeRTOS #endif +#if ( ( configNUMBER_OF_CORES == 1 ) && ( configUSE_CORE_AFFINITY != 0 ) ) + #error configUSE_CORE_AFFINITY is not supported in single core FreeRTOS +#endif + #if ( ( configNUMBER_OF_CORES > 1 ) && ( configUSE_PORT_OPTIMISED_TASK_SELECTION != 0 ) ) #error configUSE_PORT_OPTIMISED_TASK_SELECTION is not supported in SMP FreeRTOS #endif diff --git a/tasks.c b/tasks.c index 1efb0d3e3..6b1c7a65f 100644 --- a/tasks.c +++ b/tasks.c @@ -288,6 +288,8 @@ #define INFINITE_LOOP() 1 #endif +#define taskBITS_PER_BYTE ( ( size_t ) 8 ) + /* * Task control block. A task control block (TCB) is allocated for each task, * and stores task state information, including a pointer to the task's context @@ -302,7 +304,7 @@ typedef struct tskTaskControlBlock /* The old naming convention is used to #endif #if ( configUSE_CORE_AFFINITY == 1 ) && ( configNUMBER_OF_CORES > 1 ) - UBaseType_t uxCoreAffinityMask; /*< Used to link the task to certain cores. UBaseType_t must have greater than or equal to the number of bits as confNUM_CORES. */ + UBaseType_t uxCoreAffinityMask; /**< Used to link the task to certain cores. UBaseType_t must have greater than or equal to the number of bits as configNUMBER_OF_CORES. */ #endif ListItem_t xStateListItem; /**< The list that the state list item of a task is reference from denotes the state of that task (Ready, Blocked, Suspended ). */ @@ -3249,6 +3251,14 @@ void vTaskStartScheduler( void ) { BaseType_t xReturn; + #if ( configUSE_CORE_AFFINITY == 1 ) && ( configNUMBER_OF_CORES > 1 ) + { + /* Sanity check that the UBaseType_t must have greater than or equal to + * the number of bits as confNUMBER_OF_CORES. */ + configASSERT( ( sizeof( UBaseType_t ) * taskBITS_PER_BYTE ) >= configNUMBER_OF_CORES ); + } + #endif /* #if ( configUSE_CORE_AFFINITY == 1 ) && ( configNUMBER_OF_CORES > 1 ) */ + xReturn = prvCreateIdleTasks(); #if ( configUSE_TIMERS == 1 )