Add vApplicationGetPassiveIdleTaskMemory for SMP (#890)
* Update vApplicationGetIdleTaskMemory prototype for SMP. Now SMP and
single core use the same prototype for compatibility.
* Add vApplicationGetPassiveIdleTaskMemory for SMP to get passive idle
task memory.
diff --git a/include/task.h b/include/task.h
index c369f0c..9ff1992 100644
--- a/include/task.h
+++ b/include/task.h
@@ -1961,8 +1961,6 @@
#if ( configSUPPORT_STATIC_ALLOCATION == 1 )
- #if ( configNUMBER_OF_CORES == 1 )
-
/**
* task.h
* @code{c}
@@ -1976,15 +1974,14 @@
* @param ppxIdleTaskStackBuffer A handle to a statically allocated Stack buffer for the idle task
* @param pulIdleTaskStackSize A pointer to the number of elements that will fit in the allocated stack buffer
*/
- void vApplicationGetIdleTaskMemory( StaticTask_t ** ppxIdleTaskTCBBuffer,
- StackType_t ** ppxIdleTaskStackBuffer,
- uint32_t * pulIdleTaskStackSize ); /*lint !e526 Symbol not defined as it is an application callback. */
- #else /* #if ( configNUMBER_OF_CORES == 1 ) */
+ void vApplicationGetIdleTaskMemory( StaticTask_t ** ppxIdleTaskTCBBuffer,
+ StackType_t ** ppxIdleTaskStackBuffer,
+ uint32_t * pulIdleTaskStackSize ); /*lint !e526 Symbol not defined as it is an application callback. */
/**
* task.h
* @code{c}
- * void vApplicationGetIdleTaskMemory( StaticTask_t ** ppxIdleTaskTCBBuffer, StackType_t ** ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize, BaseType_t xCoreID )
+ * void vApplicationGetPassiveIdleTaskMemory( StaticTask_t ** ppxIdleTaskTCBBuffer, StackType_t ** ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize, BaseType_t xCoreID )
* @endcode
*
* This function is used to provide a statically allocated block of memory to FreeRTOS to hold the Idle Tasks TCB. This function is required when
@@ -1996,20 +1993,21 @@
* These idle tasks are created to ensure that each core has an idle task to run when
* no other task is available to run.
*
- * The function vApplicationGetIdleTaskMemory is called with xCoreID 0 to get the
- * memory for Active idle task. It is called with xCoreID 1, 2 ... ( configNUMBER_OF_CORES - 1 )
- * to get memory for passive idle tasks.
+ * The function vApplicationGetPassiveIdleTaskMemory is called with passive idle
+ * task index 0, 1 ... ( configNUMBER_OF_CORES - 2 ) to get memory for passive idle
+ * tasks.
*
* @param ppxIdleTaskTCBBuffer A handle to a statically allocated TCB buffer
* @param ppxIdleTaskStackBuffer A handle to a statically allocated Stack buffer for the idle task
* @param pulIdleTaskStackSize A pointer to the number of elements that will fit in the allocated stack buffer
- * @param xCoreId The core index of the idle task buffer
+ * @param xPassiveIdleTaskIndex The passive idle task index of the idle task buffer
*/
- void vApplicationGetIdleTaskMemory( StaticTask_t ** ppxIdleTaskTCBBuffer,
- StackType_t ** ppxIdleTaskStackBuffer,
- uint32_t * pulIdleTaskStackSize, /*lint !e526 Symbol not defined as it is an application callback. */
- BaseType_t xCoreID );
- #endif /* #if ( configNUMBER_OF_CORES == 1 ) */
+ #if ( configNUMBER_OF_CORES > 1 )
+ void vApplicationGetPassiveIdleTaskMemory( StaticTask_t ** ppxIdleTaskTCBBuffer,
+ StackType_t ** ppxIdleTaskStackBuffer,
+ uint32_t * pulIdleTaskStackSize,
+ BaseType_t xPassiveIdleTaskIndex );
+ #endif /* #if ( configNUMBER_OF_CORES > 1 ) */
#endif /* if ( configSUPPORT_STATIC_ALLOCATION == 1 ) */
/**
diff --git a/tasks.c b/tasks.c
index 5500bf4..7770838 100644
--- a/tasks.c
+++ b/tasks.c
@@ -3575,10 +3575,21 @@
/* The Idle task is created using user provided RAM - obtain the
* address of the RAM then create the idle task. */
#if ( configNUMBER_OF_CORES == 1 )
+ {
vApplicationGetIdleTaskMemory( &pxIdleTaskTCBBuffer, &pxIdleTaskStackBuffer, &ulIdleTaskStackSize );
+ }
#else
- vApplicationGetIdleTaskMemory( &pxIdleTaskTCBBuffer, &pxIdleTaskStackBuffer, &ulIdleTaskStackSize, xCoreID );
- #endif
+ {
+ if( xCoreID == 0 )
+ {
+ vApplicationGetIdleTaskMemory( &pxIdleTaskTCBBuffer, &pxIdleTaskStackBuffer, &ulIdleTaskStackSize );
+ }
+ else
+ {
+ vApplicationGetPassiveIdleTaskMemory( &pxIdleTaskTCBBuffer, &pxIdleTaskStackBuffer, &ulIdleTaskStackSize, xCoreID - 1 );
+ }
+ }
+ #endif /* if ( configNUMBER_OF_CORES == 1 ) */
xIdleTaskHandles[ xCoreID ] = xTaskCreateStatic( pxIdleTaskFunction,
cIdleName,
ulIdleTaskStackSize,
@@ -8523,36 +8534,34 @@
* it's own implementation of vApplicationGetIdleTaskMemory by setting
* configKERNEL_PROVIDED_STATIC_MEMORY to 0 or leaving it undefined.
*/
- #if ( configNUMBER_OF_CORES == 1 )
+ void vApplicationGetIdleTaskMemory( StaticTask_t ** ppxIdleTaskTCBBuffer,
+ StackType_t ** ppxIdleTaskStackBuffer,
+ uint32_t * pulIdleTaskStackSize )
+ {
+ static StaticTask_t xIdleTaskTCB;
+ static StackType_t uxIdleTaskStack[ configMINIMAL_STACK_SIZE ];
- void vApplicationGetIdleTaskMemory( StaticTask_t ** ppxIdleTaskTCBBuffer,
- StackType_t ** ppxIdleTaskStackBuffer,
- uint32_t * pulIdleTaskStackSize )
+ *ppxIdleTaskTCBBuffer = &( xIdleTaskTCB );
+ *ppxIdleTaskStackBuffer = &( uxIdleTaskStack[ 0 ] );
+ *pulIdleTaskStackSize = configMINIMAL_STACK_SIZE;
+ }
+
+ #if ( configNUMBER_OF_CORES > 1 )
+
+ void vApplicationGetPassiveIdleTaskMemory( StaticTask_t ** ppxIdleTaskTCBBuffer,
+ StackType_t ** ppxIdleTaskStackBuffer,
+ uint32_t * pulIdleTaskStackSize,
+ BaseType_t xPassiveIdleTaskIndex )
{
- static StaticTask_t xIdleTaskTCB;
- static StackType_t uxIdleTaskStack[ configMINIMAL_STACK_SIZE ];
+ static StaticTask_t xIdleTaskTCBs[ configNUMBER_OF_CORES - 1 ];
+ static StackType_t uxIdleTaskStacks[ configNUMBER_OF_CORES - 1 ][ configMINIMAL_STACK_SIZE ];
- *ppxIdleTaskTCBBuffer = &( xIdleTaskTCB );
- *ppxIdleTaskStackBuffer = &( uxIdleTaskStack[ 0 ] );
+ *ppxIdleTaskTCBBuffer = &( xIdleTaskTCBs[ xPassiveIdleTaskIndex ] );
+ *ppxIdleTaskStackBuffer = &( uxIdleTaskStacks[ xPassiveIdleTaskIndex ][ 0 ] );
*pulIdleTaskStackSize = configMINIMAL_STACK_SIZE;
}
- #else /* #if ( configNUMBER_OF_CORES == 1 ) */
-
- void vApplicationGetIdleTaskMemory( StaticTask_t ** ppxIdleTaskTCBBuffer,
- StackType_t ** ppxIdleTaskStackBuffer,
- uint32_t * pulIdleTaskStackSize,
- BaseType_t xCoreId )
- {
- static StaticTask_t xIdleTaskTCBs[ configNUMBER_OF_CORES ];
- static StackType_t uxIdleTaskStacks[ configNUMBER_OF_CORES ][ configMINIMAL_STACK_SIZE ];
-
- *ppxIdleTaskTCBBuffer = &( xIdleTaskTCBs[ xCoreId ] );
- *ppxIdleTaskStackBuffer = &( uxIdleTaskStacks[ xCoreId ][ 0 ] );
- *pulIdleTaskStackSize = configMINIMAL_STACK_SIZE;
- }
-
- #endif /* #if ( configNUMBER_OF_CORES == 1 ) */
+ #endif /* #if ( configNUMBER_OF_CORES > 1 ) */
#endif /* #if ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configKERNEL_PROVIDED_STATIC_MEMORY == 1 ) && ( portUSING_MPU_WRAPPERS == 0 ) ) */
/*-----------------------------------------------------------*/