Skip to content

Commit eb7d86f

Browse files
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 <[email protected]>
1 parent 308d050 commit eb7d86f

File tree

3 files changed

+247
-152
lines changed

3 files changed

+247
-152
lines changed

include/FreeRTOS.h

Lines changed: 11 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -451,7 +451,7 @@
451451
#if ( ( portUSING_GRANULAR_LOCKS == 1 ) || ( configNUMBER_OF_CORES == 1 ) )
452452
#define portRELEASE_TASK_LOCK( xCoreID )
453453
#else
454-
#error portRELEASE_TASK_LOCK is required in SMP
454+
#error portRELEASE_TASK_LOCK is required in SMP without granular locking feature enabled
455455
#endif
456456

457457
#endif /* portRELEASE_TASK_LOCK */
@@ -461,7 +461,7 @@
461461
#if ( ( portUSING_GRANULAR_LOCKS == 1 ) || ( configNUMBER_OF_CORES == 1 ) )
462462
#define portGET_TASK_LOCK( xCoreID )
463463
#else
464-
#error portGET_TASK_LOCK is required in SMP
464+
#error portGET_TASK_LOCK is required in SMP without granular locking feature enabled
465465
#endif
466466

467467
#endif /* portGET_TASK_LOCK */
@@ -471,7 +471,7 @@
471471
#if ( ( portUSING_GRANULAR_LOCKS == 1 ) || ( configNUMBER_OF_CORES == 1 ) )
472472
#define portRELEASE_ISR_LOCK( xCoreID )
473473
#else
474-
#error portRELEASE_ISR_LOCK is required in SMP
474+
#error portRELEASE_ISR_LOCK is required in SMP without granular locking feature enabled
475475
#endif
476476

477477
#endif /* portRELEASE_ISR_LOCK */
@@ -481,23 +481,23 @@
481481
#if ( ( portUSING_GRANULAR_LOCKS == 1 ) || ( configNUMBER_OF_CORES == 1 ) )
482482
#define portGET_ISR_LOCK( xCoreID )
483483
#else
484-
#error portGET_ISR_LOCK is required in SMP
484+
#error portGET_ISR_LOCK is required in SMP without granular locking feature enabled
485485
#endif
486486

487487
#endif /* portGET_ISR_LOCK */
488488

489489
#ifndef portRELEASE_SPINLOCK
490490

491491
#if ( ( portUSING_GRANULAR_LOCKS == 1 ) && ( configNUMBER_OF_CORES > 1 ) )
492-
#error portRELEASE_SPINLOCK is required for granular locking
492+
#error portRELEASE_SPINLOCK is required for SMP with granular locking feature enabled
493493
#endif
494494

495495
#endif
496496

497497
#ifndef portGET_SPINLOCK
498498

499499
#if ( ( portUSING_GRANULAR_LOCKS == 1 ) && ( configNUMBER_OF_CORES > 1 ) )
500-
#error portGET_SPINLOCK is required for granular locking
500+
#error portGET_SPINLOCK is required for SMP with granular locking feature enabled
501501
#endif
502502

503503
#endif
@@ -526,38 +526,6 @@
526526

527527
#endif
528528

529-
#ifndef portENTER_CRITICAL_DATA_GROUP
530-
531-
#if ( ( portUSING_GRANULAR_LOCKS == 1 ) && ( configNUMBER_OF_CORES > 1 ) )
532-
#error portENTER_CRITICAL_DATA_GROUP is required for SMP with granular locking feature enabled
533-
#endif
534-
535-
#endif
536-
537-
#ifndef portEXIT_CRITICAL_DATA_GROUP
538-
539-
#if ( ( portUSING_GRANULAR_LOCKS == 1 ) && ( configNUMBER_OF_CORES > 1 ) )
540-
#error portEXIT_CRITICAL_DATA_GROUP is required for SMP with granular locking feature enabled
541-
#endif
542-
543-
#endif
544-
545-
#ifndef portENTER_CRITICAL_DATA_GROUP_FROM_ISR
546-
547-
#if ( ( portUSING_GRANULAR_LOCKS == 1 ) && ( configNUMBER_OF_CORES > 1 ) )
548-
#error portENTER_CRITICAL_DATA_GROUP_FROM_ISR is required for SMP with granular locking feature enabled
549-
#endif
550-
551-
#endif
552-
553-
#ifndef portEXIT_CRITICAL_DATA_GROUP_FROM_ISR
554-
555-
#if ( ( portUSING_GRANULAR_LOCKS == 1 ) && ( configNUMBER_OF_CORES > 1 ) )
556-
#error portEXIT_CRITICAL_DATA_GROUP_FROM_ISR is required for SMP with granular locking feature enabled
557-
#endif
558-
559-
#endif
560-
561529
#ifndef portSPINLOCK_TYPE
562530

563531
#if ( ( portUSING_GRANULAR_LOCKS == 1 ) && ( configNUMBER_OF_CORES > 1 ) )
@@ -566,82 +534,18 @@
566534

567535
#endif
568536

569-
#ifndef portINIT_EVENT_GROUP_TASK_SPINLOCK
570-
571-
#if ( ( portUSING_GRANULAR_LOCKS == 1 ) && ( configNUMBER_OF_CORES > 1 ) )
572-
#error portINIT_EVENT_GROUP_TASK_SPINLOCK is required for granular locking
573-
#endif
574-
575-
#endif
576-
577-
#ifndef portINIT_EVENT_GROUP_ISR_SPINLOCK
537+
#ifndef portINIT_SPINLOCK
578538

579539
#if ( ( portUSING_GRANULAR_LOCKS == 1 ) && ( configNUMBER_OF_CORES > 1 ) )
580-
#error portINIT_EVENT_GROUP_ISR_SPINLOCK is required for granular locking
540+
#error portINIT_SPINLOCK is required for SMP with granular locking feature enabled
581541
#endif
582542

583543
#endif
584544

585-
#ifndef portINIT_QUEUE_TASK_SPINLOCK
545+
#ifndef portINIT_SPINLOCK_STATIC
586546

587547
#if ( ( portUSING_GRANULAR_LOCKS == 1 ) && ( configNUMBER_OF_CORES > 1 ) )
588-
#error portINIT_QUEUE_TASK_SPINLOCK is required for granular locking
589-
#endif
590-
591-
#endif
592-
593-
#ifndef portINIT_QUEUE_ISR_SPINLOCK
594-
595-
#if ( ( portUSING_GRANULAR_LOCKS == 1 ) && ( configNUMBER_OF_CORES > 1 ) )
596-
#error portINIT_QUEUE_ISR_SPINLOCK is required for granular locking
597-
#endif
598-
599-
#endif
600-
601-
#ifndef portINIT_STREAM_BUFFER_TASK_SPINLOCK
602-
603-
#if ( ( portUSING_GRANULAR_LOCKS == 1 ) && ( configNUMBER_OF_CORES > 1 ) )
604-
#error portINIT_STREAM_BUFFER_TASK_SPINLOCK is required for granular locking
605-
#endif
606-
607-
#endif
608-
609-
#ifndef portINIT_STREAM_BUFFER_ISR_SPINLOCK
610-
611-
#if ( ( portUSING_GRANULAR_LOCKS == 1 ) && ( configNUMBER_OF_CORES > 1 ) )
612-
#error portINIT_STREAM_BUFFER_ISR_SPINLOCK is required for granular locking
613-
#endif
614-
615-
#endif
616-
617-
#ifndef portINIT_KERNEL_TASK_SPINLOCK_STATIC
618-
619-
#if ( ( portUSING_GRANULAR_LOCKS == 1 ) && ( configNUMBER_OF_CORES > 1 ) )
620-
#error portINIT_KERNEL_TASK_SPINLOCK_STATIC is required for granular locking
621-
#endif
622-
623-
#endif
624-
625-
#ifndef portINIT_KERNEL_ISR_SPINLOCK_STATIC
626-
627-
#if ( ( portUSING_GRANULAR_LOCKS == 1 ) && ( configNUMBER_OF_CORES > 1 ) )
628-
#error portINIT_KERNEL_ISR_SPINLOCK_STATIC is required for granular locking
629-
#endif
630-
631-
#endif
632-
633-
#ifndef portINIT_TIMERS_TASK_SPINLOCK_STATIC
634-
635-
#if ( ( portUSING_GRANULAR_LOCKS == 1 ) && ( configNUMBER_OF_CORES > 1 ) )
636-
#error portINIT_TIMERS_TASK_SPINLOCK_STATIC is required for granular locking
637-
#endif
638-
639-
#endif
640-
641-
#ifndef portINIT_TIMERS_ISR_SPINLOCK_STATIC
642-
643-
#if ( ( portUSING_GRANULAR_LOCKS == 1 ) && ( configNUMBER_OF_CORES > 1 ) )
644-
#error portINIT_TIMERS_ISR_SPINLOCK_STATIC is required for granular locking
548+
#error portINIT_SPINLOCK_STATIC is required for SMP with granular locking feature enabled
645549
#endif
646550

647551
#endif
@@ -3062,7 +2966,7 @@
30622966
#endif /* #if ( ( portUSING_GRANULAR_LOCKS == 1 ) && ( configNUMBER_OF_CORES > 1 ) ) */
30632967
#define portTICK_TYPE_SET_INTERRUPT_MASK_FROM_ISR() portSET_INTERRUPT_MASK_FROM_ISR()
30642968
#define portTICK_TYPE_CLEAR_INTERRUPT_MASK_FROM_ISR( x ) portCLEAR_INTERRUPT_MASK_FROM_ISR( ( x ) )
3065-
#else
2969+
#else /* if ( portTICK_TYPE_IS_ATOMIC == 0 ) */
30662970

30672971
/* The tick type can be read atomically, so critical sections used when the
30682972
* tick count is returned can be defined away. */

0 commit comments

Comments
 (0)