mirror of
https://github.com/FreeRTOS/FreeRTOS-Kernel.git
synced 2025-08-19 09:38:32 -04:00
feat(granular_locks): Add granular locking functions
- Updated prvCheckForRunStateChange() for granular locks - Updated vTaskSuspendAll() and xTaskResumeAll() - Now holds the xTaskSpinlock during kernel suspension - Increments/decrements xPreemptionDisable. Only yields when 0, thus allowing for nested suspensions across different data groups Co-authored-by: Sudeep Mohanty <sudeep.mohanty@espressif.com>
This commit is contained in:
parent
6c5458c5f3
commit
8ceb94dadf
3 changed files with 241 additions and 154 deletions
|
@ -461,7 +461,7 @@
|
|||
#if ( ( portUSING_GRANULAR_LOCKS == 1 ) || ( configNUMBER_OF_CORES == 1 ) )
|
||||
#define portRELEASE_TASK_LOCK( xCoreID )
|
||||
#else
|
||||
#error portRELEASE_TASK_LOCK is required in SMP
|
||||
#error portRELEASE_TASK_LOCK is required in SMP without granular locking feature enabled
|
||||
#endif
|
||||
|
||||
#endif /* portRELEASE_TASK_LOCK */
|
||||
|
@ -471,7 +471,7 @@
|
|||
#if ( ( portUSING_GRANULAR_LOCKS == 1 ) || ( configNUMBER_OF_CORES == 1 ) )
|
||||
#define portGET_TASK_LOCK( xCoreID )
|
||||
#else
|
||||
#error portGET_TASK_LOCK is required in SMP
|
||||
#error portGET_TASK_LOCK is required in SMP without granular locking feature enabled
|
||||
#endif
|
||||
|
||||
#endif /* portGET_TASK_LOCK */
|
||||
|
@ -481,7 +481,7 @@
|
|||
#if ( ( portUSING_GRANULAR_LOCKS == 1 ) || ( configNUMBER_OF_CORES == 1 ) )
|
||||
#define portRELEASE_ISR_LOCK( xCoreID )
|
||||
#else
|
||||
#error portRELEASE_ISR_LOCK is required in SMP
|
||||
#error portRELEASE_ISR_LOCK is required in SMP without granular locking feature enabled
|
||||
#endif
|
||||
|
||||
#endif /* portRELEASE_ISR_LOCK */
|
||||
|
@ -491,7 +491,7 @@
|
|||
#if ( ( portUSING_GRANULAR_LOCKS == 1 ) || ( configNUMBER_OF_CORES == 1 ) )
|
||||
#define portGET_ISR_LOCK( xCoreID )
|
||||
#else
|
||||
#error portGET_ISR_LOCK is required in SMP
|
||||
#error portGET_ISR_LOCK is required in SMP without granular locking feature enabled
|
||||
#endif
|
||||
|
||||
#endif /* portGET_ISR_LOCK */
|
||||
|
@ -499,7 +499,7 @@
|
|||
#ifndef portRELEASE_SPINLOCK
|
||||
|
||||
#if ( ( portUSING_GRANULAR_LOCKS == 1 ) && ( configNUMBER_OF_CORES > 1 ) )
|
||||
#error portRELEASE_SPINLOCK is required for granular locking
|
||||
#error portRELEASE_SPINLOCK is required for SMP with granular locking feature enabled
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
@ -507,7 +507,7 @@
|
|||
#ifndef portGET_SPINLOCK
|
||||
|
||||
#if ( ( portUSING_GRANULAR_LOCKS == 1 ) && ( configNUMBER_OF_CORES > 1 ) )
|
||||
#error portGET_SPINLOCK is required for granular locking
|
||||
#error portGET_SPINLOCK is required for SMP with granular locking feature enabled
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
@ -536,38 +536,6 @@
|
|||
|
||||
#endif
|
||||
|
||||
#ifndef portENTER_CRITICAL_DATA_GROUP
|
||||
|
||||
#if ( ( portUSING_GRANULAR_LOCKS == 1 ) && ( configNUMBER_OF_CORES > 1 ) )
|
||||
#error portENTER_CRITICAL_DATA_GROUP is required for SMP with granular locking feature enabled
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
#ifndef portEXIT_CRITICAL_DATA_GROUP
|
||||
|
||||
#if ( ( portUSING_GRANULAR_LOCKS == 1 ) && ( configNUMBER_OF_CORES > 1 ) )
|
||||
#error portEXIT_CRITICAL_DATA_GROUP is required for SMP with granular locking feature enabled
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
#ifndef portENTER_CRITICAL_DATA_GROUP_FROM_ISR
|
||||
|
||||
#if ( ( portUSING_GRANULAR_LOCKS == 1 ) && ( configNUMBER_OF_CORES > 1 ) )
|
||||
#error portENTER_CRITICAL_DATA_GROUP_FROM_ISR is required for SMP with granular locking feature enabled
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
#ifndef portEXIT_CRITICAL_DATA_GROUP_FROM_ISR
|
||||
|
||||
#if ( ( portUSING_GRANULAR_LOCKS == 1 ) && ( configNUMBER_OF_CORES > 1 ) )
|
||||
#error portEXIT_CRITICAL_DATA_GROUP_FROM_ISR is required for SMP with granular locking feature enabled
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
#ifndef portSPINLOCK_TYPE
|
||||
|
||||
#if ( ( portUSING_GRANULAR_LOCKS == 1 ) && ( configNUMBER_OF_CORES > 1 ) )
|
||||
|
@ -576,82 +544,18 @@
|
|||
|
||||
#endif
|
||||
|
||||
#ifndef portINIT_EVENT_GROUP_TASK_SPINLOCK
|
||||
#ifndef portINIT_SPINLOCK
|
||||
|
||||
#if ( ( portUSING_GRANULAR_LOCKS == 1 ) && ( configNUMBER_OF_CORES > 1 ) )
|
||||
#error portINIT_EVENT_GROUP_TASK_SPINLOCK is required for granular locking
|
||||
#error portINIT_SPINLOCK is required for SMP with granular locking feature enabled
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
#ifndef portINIT_EVENT_GROUP_ISR_SPINLOCK
|
||||
#ifndef portINIT_SPINLOCK_STATIC
|
||||
|
||||
#if ( ( portUSING_GRANULAR_LOCKS == 1 ) && ( configNUMBER_OF_CORES > 1 ) )
|
||||
#error portINIT_EVENT_GROUP_ISR_SPINLOCK is required for granular locking
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
#ifndef portINIT_QUEUE_TASK_SPINLOCK
|
||||
|
||||
#if ( ( portUSING_GRANULAR_LOCKS == 1 ) && ( configNUMBER_OF_CORES > 1 ) )
|
||||
#error portINIT_QUEUE_TASK_SPINLOCK is required for granular locking
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
#ifndef portINIT_QUEUE_ISR_SPINLOCK
|
||||
|
||||
#if ( ( portUSING_GRANULAR_LOCKS == 1 ) && ( configNUMBER_OF_CORES > 1 ) )
|
||||
#error portINIT_QUEUE_ISR_SPINLOCK is required for granular locking
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
#ifndef portINIT_STREAM_BUFFER_TASK_SPINLOCK
|
||||
|
||||
#if ( ( portUSING_GRANULAR_LOCKS == 1 ) && ( configNUMBER_OF_CORES > 1 ) )
|
||||
#error portINIT_STREAM_BUFFER_TASK_SPINLOCK is required for granular locking
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
#ifndef portINIT_STREAM_BUFFER_ISR_SPINLOCK
|
||||
|
||||
#if ( ( portUSING_GRANULAR_LOCKS == 1 ) && ( configNUMBER_OF_CORES > 1 ) )
|
||||
#error portINIT_STREAM_BUFFER_ISR_SPINLOCK is required for granular locking
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
#ifndef portINIT_KERNEL_TASK_SPINLOCK_STATIC
|
||||
|
||||
#if ( ( portUSING_GRANULAR_LOCKS == 1 ) && ( configNUMBER_OF_CORES > 1 ) )
|
||||
#error portINIT_KERNEL_TASK_SPINLOCK_STATIC is required for granular locking
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
#ifndef portINIT_KERNEL_ISR_SPINLOCK_STATIC
|
||||
|
||||
#if ( ( portUSING_GRANULAR_LOCKS == 1 ) && ( configNUMBER_OF_CORES > 1 ) )
|
||||
#error portINIT_KERNEL_ISR_SPINLOCK_STATIC is required for granular locking
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
#ifndef portINIT_TIMERS_TASK_SPINLOCK_STATIC
|
||||
|
||||
#if ( ( portUSING_GRANULAR_LOCKS == 1 ) && ( configNUMBER_OF_CORES > 1 ) )
|
||||
#error portINIT_TIMERS_TASK_SPINLOCK_STATIC is required for granular locking
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
#ifndef portINIT_TIMERS_ISR_SPINLOCK_STATIC
|
||||
|
||||
#if ( ( portUSING_GRANULAR_LOCKS == 1 ) && ( configNUMBER_OF_CORES > 1 ) )
|
||||
#error portINIT_TIMERS_ISR_SPINLOCK_STATIC is required for granular locking
|
||||
#error portINIT_SPINLOCK_STATIC is required for SMP with granular locking feature enabled
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
@ -3072,7 +2976,7 @@
|
|||
#endif /* #if ( ( portUSING_GRANULAR_LOCKS == 1 ) && ( configNUMBER_OF_CORES > 1 ) ) */
|
||||
#define portTICK_TYPE_SET_INTERRUPT_MASK_FROM_ISR() portSET_INTERRUPT_MASK_FROM_ISR()
|
||||
#define portTICK_TYPE_CLEAR_INTERRUPT_MASK_FROM_ISR( x ) portCLEAR_INTERRUPT_MASK_FROM_ISR( ( x ) )
|
||||
#else
|
||||
#else /* if ( portTICK_TYPE_IS_ATOMIC == 0 ) */
|
||||
|
||||
/* The tick type can be read atomically, so critical sections used when the
|
||||
* tick count is returned can be defined away. */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue