Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/FreeRTOS/FreeRTOS-Kernel.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorchinglee-iot <61685396+chinglee-iot@users.noreply.github.com>2023-12-04 05:49:41 +0300
committerGitHub <noreply@github.com>2023-12-04 05:49:41 +0300
commitc0ce725293bb8cf9b30626a8bba173af33163533 (patch)
tree4a66439567e82b935be49458423eb839a853f706 /portable
parentf8ef5f605b28c00b5251e8cf7c45b8ac1a54ef86 (diff)
Add SMP template port and example (#900)
* Add SMP template port and example * Add readme file for smp configuration * Update SMP build flow and add CI build --------- Co-authored-by: Soren Ptak <ptaksoren@gmail.com> Co-authored-by: Rahul Kar <118818625+kar-rahul-aws@users.noreply.github.com>
Diffstat (limited to 'portable')
-rw-r--r--portable/template/port.c42
-rw-r--r--portable/template/portmacro.h77
2 files changed, 99 insertions, 20 deletions
diff --git a/portable/template/port.c b/portable/template/port.c
index 4011eac15..d4eb56eac 100644
--- a/portable/template/port.c
+++ b/portable/template/port.c
@@ -25,8 +25,18 @@ StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack,
void vPortYield( void )
{
/* Save the current Context */
+
/* Switch to the highest priority task that is ready to run. */
- vTaskSwitchContext();
+ #if ( configNUMBER_OF_CORES == 1 )
+ {
+ vTaskSwitchContext();
+ }
+ #else
+ {
+ vTaskSwitchContext( portGET_CORE_ID() );
+ }
+ #endif
+
/* Start executing the task we have just switched to. */
}
@@ -35,12 +45,34 @@ static void prvTickISR( void )
/* Interrupts must have been enabled for the ISR to fire, so we have to
* save the context with interrupts enabled. */
- /* Maintain the tick count. */
- if( xTaskIncrementTick() != pdFALSE )
+ #if ( configNUMBER_OF_CORES == 1 )
{
- /* Switch to the highest priority task that is ready to run. */
- vTaskSwitchContext();
+ /* Maintain the tick count. */
+ if( xTaskIncrementTick() != pdFALSE )
+ {
+ /* Switch to the highest priority task that is ready to run. */
+ vTaskSwitchContext();
+ }
+ }
+ #else
+ {
+ UBaseType_t ulPreviousMask;
+
+ /* Tasks or ISRs running on other cores may still in critical section in
+ * multiple cores environment. Incrementing tick needs to performed in
+ * critical section. */
+ ulPreviousMask = taskENTER_CRITICAL_FROM_ISR();
+
+ /* Maintain the tick count. */
+ if( xTaskIncrementTick() != pdFALSE )
+ {
+ /* Switch to the highest priority task that is ready to run. */
+ vTaskSwitchContext( portGET_CORE_ID() );
+ }
+
+ taskEXIT_CRITICAL_FROM_ISR( ulPreviousMask );
}
+ #endif /* if ( configNUMBER_OF_CORES == 1 ) */
/* start executing the new task */
}
diff --git a/portable/template/portmacro.h b/portable/template/portmacro.h
index 4e4aa934d..199053208 100644
--- a/portable/template/portmacro.h
+++ b/portable/template/portmacro.h
@@ -64,26 +64,42 @@ typedef unsigned char UBaseType_t;
/*-----------------------------------------------------------*/
#define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) \
- { \
+ do { \
uxTopPriority = 0; \
- } \
- while( 0 )
+ } while( 0 )
#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */
-#define portDISABLE_INTERRUPTS() \
- { /* Disable the interrupts */ \
- }
-#define portENABLE_INTERRUPTS() \
- { /* Enable the interrupts */ \
- }
+/* Disable the interrupts */
+#define portDISABLE_INTERRUPTS() do {} while( 0 )
-#define portENTER_CRITICAL() \
- { /* preserve current interrupt state and then disable interrupts */ \
- }
-#define portEXIT_CRITICAL() \
- { /* restore previously preserved interrupt state */ \
- }
+/* Enable the interrupts */
+#define portENABLE_INTERRUPTS() do {} while( 0 )
+
+#if ( configNUMBER_OF_CORES == 1 )
+/* preserve current interrupt state and then disable interrupts */
+ #define portENTER_CRITICAL() do {} while( 0 )
+
+/* restore previously preserved interrupt state */
+ #define portEXIT_CRITICAL() do {} while( 0 )
+#else
+
+/* The port can maintain the critical nesting count in TCB or maintain the critical
+ * nesting count in the port. */
+ #define portCRITICAL_NESTING_IN_TCB 1
+
+/* vTaskEnterCritical and vTaskExitCritical should be used in the implementation
+ * of portENTER/EXIT_CRITICAL if the number of cores is more than 1 in the system. */
+ #define portENTER_CRITICAL vTaskEnterCritical
+ #define portEXIT_CRITICAL vTaskExitCritical
+
+/* vTaskEnterCriticalFromISR and vTaskExitCriticalFromISR should be used in the
+ * implementation of portENTER/EXIT_CRITICAL_FROM_ISR if the number of cores is
+ * more than 1 in the system. */
+ #define portENTER_CRITICAL_FROM_ISR vTaskEnterCriticalFromISR
+ #define portEXIT_CRITICAL_FROM_ISR vTaskExitCriticalFromISR
+
+#endif /* if ( configNUMBER_OF_CORES == 1 ) */
extern void vPortYield( void );
#define portYIELD() vPortYield()
@@ -92,4 +108,35 @@ extern void vPortYield( void );
#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters )
#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters )
+#if ( configNUMBER_OF_CORES > 1 )
+ /* Return the core ID on which the code is running. */
+ #define portGET_CORE_ID() 0
+
+/* Set the interrupt mask. */
+ #define portSET_INTERRUPT_MASK() 0
+
+/* Clear the interrupt mask. */
+ #define portCLEAR_INTERRUPT_MASK( x ) ( ( void ) ( x ) )
+
+/* Request the core ID x to yield. */
+ #define portYIELD_CORE( x ) do {} while( 0 )
+
+/* Acquire the TASK lock. TASK lock is a recursive lock.
+ * It should be able to be locked by the same core multiple times. */
+ #define portGET_TASK_LOCK() do {} while( 0 )
+
+/* Release the TASK lock. If a TASK lock is locked by the same core multiple times,
+ * it should be released as many times as it is locked. */
+ #define portRELEASE_TASK_LOCK() do {} while( 0 )
+
+/* Acquire the ISR lock. ISR lock is a recursive lock.
+ * It should be able to be locked by the same core multiple times. */
+ #define portGET_ISR_LOCK() do {} while( 0 )
+
+/* Release the ISR lock. If a ISR lock is locked by the same core multiple times, \
+ * it should be released as many times as it is locked. */
+ #define portRELEASE_ISR_LOCK() do {} while( 0 )
+
+#endif /* if ( configNUMBER_OF_CORES > 1 ) */
+
#endif /* PORTMACRO_H */