diff --git a/components/freertos/include/freertos/task.h b/components/freertos/include/freertos/task.h index ddf7a7589..9f3f3d659 100644 --- a/components/freertos/include/freertos/task.h +++ b/components/freertos/include/freertos/task.h @@ -1979,6 +1979,12 @@ BaseType_t xTaskGenericCreate( TaskFunction_t pxTaskCode, const char * const pcN */ UBaseType_t uxTaskGetTaskNumber( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + +/* + * Get the current core affinity of a task + */ +BaseType_t xTaskGetAffinity( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + /* * Set the uxTaskNumber of the task referenced by the xTask parameter to * uxHandle. diff --git a/components/freertos/tasks.c b/components/freertos/tasks.c index 806a047f4..5eb4687e0 100644 --- a/components/freertos/tasks.c +++ b/components/freertos/tasks.c @@ -160,7 +160,7 @@ typedef struct tskTaskControlBlock StackType_t *pxStack; /*< Points to the start of the stack. */ char pcTaskName[ configMAX_TASK_NAME_LEN ];/*< Descriptive name given to the task when created. Facilitates debugging only. */ /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ BaseType_t xCoreID; /*< Core this task is pinned to */ - + /* If this moves around (other than pcTaskName size changes), please change the define in xtensa_vectors.S as well. */ #if ( portSTACK_GROWTH > 0 ) StackType_t *pxEndOfStack; /*< Points to the end of the stack on architectures where the stack grows up from low memory. */ #endif @@ -3339,6 +3339,18 @@ TCB_t *pxNewTCB; } /*-----------------------------------------------------------*/ +BaseType_t xTaskGetAffinity( TaskHandle_t xTask ) +{ + TCB_t *pxTCB; + UBaseType_t uxReturn; + + pxTCB = prvGetTCBFromHandle( xTask ); + + return pxTCB->xCoreID; +} +/*-----------------------------------------------------------*/ + + #if ( configUSE_TRACE_FACILITY == 1 ) static UBaseType_t prvListTaskWithinSingleList( TaskStatus_t *pxTaskStatusArray, List_t *pxList, eTaskState eState ) diff --git a/components/freertos/xtensa_vectors.S b/components/freertos/xtensa_vectors.S index 0ff6c4c19..f0d874a59 100644 --- a/components/freertos/xtensa_vectors.S +++ b/components/freertos/xtensa_vectors.S @@ -92,6 +92,12 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include "xtensa_rtos.h" +/* + Define for workaround: pin no-cpu-affinity tasks to a cpu when fpu is used. + Please change this when the tcb structure is changed +*/ +#define TASKTCB_XCOREID_OFFSET (0x3C+configMAX_TASK_NAME_LEN+3)&~3 +.extern pxCurrentTCB /* Enable stack backtrace across exception/interrupt - see below */ #define XT_DEBUG_BACKTRACE 0 @@ -892,6 +898,20 @@ _xt_coproc_exc: addx4 a0, a5, a0 /* a0 = &_xt_coproc_mask[n] */ l32i a0, a0, 0 /* a0 = (n << 16) | (1 << n) */ + /* TODO: Remove this as soon as coprocessor state moving works across cores - JD */ + /* FPU operations are incompatible with non-pinned tasks. If we have a FPU operation + here, to keep the entire thing from crashing, it's better to pin the task to whatever + core we're running on now. */ + movi a2, pxCurrentTCB + getcoreid a3 + slli a3, a3, 2 + add a2, a2, a3 + l32i a2, a2, 0 /* a2 = start of pxCurrentTCB[cpuid] */ + addi a2, a2, TASKTCB_XCOREID_OFFSET /* offset to xCoreID in tcb struct */ + getcoreid a3 + s32i a3, a2, 0 /* store current cpuid */ + + /* Grab correct xt_coproc_owner_sa for this core */ getcoreid a2 movi a3, XCHAL_CP_MAX << 2 mull a2, a2, a3