diff options
author | chinglee-iot <61685396+chinglee-iot@users.noreply.github.com> | 2023-12-04 05:49:41 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-12-04 05:49:41 +0300 |
commit | c0ce725293bb8cf9b30626a8bba173af33163533 (patch) | |
tree | 4a66439567e82b935be49458423eb839a853f706 /portable | |
parent | f8ef5f605b28c00b5251e8cf7c45b8ac1a54ef86 (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.c | 42 | ||||
-rw-r--r-- | portable/template/portmacro.h | 77 |
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 */ |