Skip to content

Commit fc47127

Browse files
change(freertos/smp): Update timers.c locking
Updated timers.c to use granular locking - Added xTaskSpinlock and xISRSpinlock - Replaced critical section macros with data group locking macros such as taskENTER/EXIT_CRITICAL() with tmrENTER/EXIT_CRITICAL(). Co-authored-by: Sudeep Mohanty <[email protected]>
1 parent f073b35 commit fc47127

File tree

1 file changed

+35
-12
lines changed

1 file changed

+35
-12
lines changed

timers.c

+35-12
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,24 @@
7979
#define tmrSTATUS_IS_STATICALLY_ALLOCATED ( 0x02U )
8080
#define tmrSTATUS_IS_AUTORELOAD ( 0x04U )
8181

82+
/*
83+
* Macro to mark the start of a critical code region.
84+
*/
85+
#if ( portUSING_GRANULAR_LOCKS == 1 )
86+
#define tmrENTER_CRITICAL( pxTaskSpinlock, pxISRSpinlock ) portLOCK_DATA_GROUP( ( portSPINLOCK_TYPE * ) pxTaskSpinlock, ( portSPINLOCK_TYPE * ) pxISRSpinlock )
87+
#else /* #if ( portUSING_GRANULAR_LOCKS == 1 ) */
88+
#define tmrENTER_CRITICAL( pxTaskSpinlock, pxISRSpinlock ) do { ( void ) pxTaskSpinlock; ( void ) pxISRSpinlock; taskENTER_CRITICAL(); } while( 0 )
89+
#endif /* #if ( portUSING_GRANULAR_LOCKS == 1 ) */
90+
91+
/*
92+
* Macro to mark the end of a critical code region.
93+
*/
94+
#if ( portUSING_GRANULAR_LOCKS == 1 )
95+
#define tmrEXIT_CRITICAL( pxTaskSpinlock, pxISRSpinlock ) portUNLOCK_DATA_GROUP( ( portSPINLOCK_TYPE * ) pxTaskSpinlock, ( portSPINLOCK_TYPE * ) pxISRSpinlock )
96+
#else /* #if ( portUSING_GRANULAR_LOCKS == 1 ) */
97+
#define tmrEXIT_CRITICAL( pxTaskSpinlock, pxISRSpinlock ) do { ( void ) pxTaskSpinlock; ( void ) pxISRSpinlock; taskEXIT_CRITICAL(); } while( 0 )
98+
#endif /* #if ( portUSING_GRANULAR_LOCKS == 1 ) */
99+
82100
/* The definition of the timers themselves. */
83101
typedef struct tmrTimerControl /* The old naming convention is used to prevent breaking kernel aware debuggers. */
84102
{
@@ -149,6 +167,11 @@
149167
PRIVILEGED_DATA static QueueHandle_t xTimerQueue = NULL;
150168
PRIVILEGED_DATA static TaskHandle_t xTimerTaskHandle = NULL;
151169

170+
#if ( ( portUSING_GRANULAR_LOCKS == 1 ) && ( configNUMBER_OF_CORES > 1 ) )
171+
PRIVILEGED_DATA static portSPINLOCK_TYPE xTaskSpinlock = portINIT_TIMERS_TASK_SPINLOCK_STATIC;
172+
PRIVILEGED_DATA static portSPINLOCK_TYPE xISRSpinlock = portINIT_TIMERS_ISR_SPINLOCK_STATIC;
173+
#endif /* #if ( ( portUSING_GRANULAR_LOCKS == 1 ) && ( configNUMBER_OF_CORES > 1 ) ) */
174+
152175
/*-----------------------------------------------------------*/
153176

154177
/*
@@ -576,7 +599,7 @@
576599
traceENTER_vTimerSetReloadMode( xTimer, xAutoReload );
577600

578601
configASSERT( xTimer );
579-
taskENTER_CRITICAL();
602+
tmrENTER_CRITICAL( &xTaskSpinlock, &xISRSpinlock );
580603
{
581604
if( xAutoReload != pdFALSE )
582605
{
@@ -587,7 +610,7 @@
587610
pxTimer->ucStatus &= ( ( uint8_t ) ~tmrSTATUS_IS_AUTORELOAD );
588611
}
589612
}
590-
taskEXIT_CRITICAL();
613+
tmrEXIT_CRITICAL( &xTaskSpinlock, &xISRSpinlock );
591614

592615
traceRETURN_vTimerSetReloadMode();
593616
}
@@ -601,7 +624,7 @@
601624
traceENTER_xTimerGetReloadMode( xTimer );
602625

603626
configASSERT( xTimer );
604-
portBASE_TYPE_ENTER_CRITICAL();
627+
tmrENTER_CRITICAL( &xTaskSpinlock, &xISRSpinlock );
605628
{
606629
if( ( pxTimer->ucStatus & tmrSTATUS_IS_AUTORELOAD ) == 0U )
607630
{
@@ -614,7 +637,7 @@
614637
xReturn = pdTRUE;
615638
}
616639
}
617-
portBASE_TYPE_EXIT_CRITICAL();
640+
tmrEXIT_CRITICAL( &xTaskSpinlock, &xISRSpinlock );
618641

619642
traceRETURN_xTimerGetReloadMode( xReturn );
620643

@@ -1113,7 +1136,7 @@
11131136
/* Check that the list from which active timers are referenced, and the
11141137
* queue used to communicate with the timer service, have been
11151138
* initialised. */
1116-
taskENTER_CRITICAL();
1139+
tmrENTER_CRITICAL( &xTaskSpinlock, &xISRSpinlock );
11171140
{
11181141
if( xTimerQueue == NULL )
11191142
{
@@ -1155,7 +1178,7 @@
11551178
mtCOVERAGE_TEST_MARKER();
11561179
}
11571180
}
1158-
taskEXIT_CRITICAL();
1181+
tmrEXIT_CRITICAL( &xTaskSpinlock, &xISRSpinlock );
11591182
}
11601183
/*-----------------------------------------------------------*/
11611184

@@ -1169,7 +1192,7 @@
11691192
configASSERT( xTimer );
11701193

11711194
/* Is the timer in the list of active timers? */
1172-
portBASE_TYPE_ENTER_CRITICAL();
1195+
tmrENTER_CRITICAL( &xTaskSpinlock, &xISRSpinlock );
11731196
{
11741197
if( ( pxTimer->ucStatus & tmrSTATUS_IS_ACTIVE ) == 0U )
11751198
{
@@ -1180,7 +1203,7 @@
11801203
xReturn = pdTRUE;
11811204
}
11821205
}
1183-
portBASE_TYPE_EXIT_CRITICAL();
1206+
tmrEXIT_CRITICAL( &xTaskSpinlock, &xISRSpinlock );
11841207

11851208
traceRETURN_xTimerIsTimerActive( xReturn );
11861209

@@ -1197,11 +1220,11 @@
11971220

11981221
configASSERT( xTimer );
11991222

1200-
taskENTER_CRITICAL();
1223+
tmrENTER_CRITICAL( &xTaskSpinlock, &xISRSpinlock );
12011224
{
12021225
pvReturn = pxTimer->pvTimerID;
12031226
}
1204-
taskEXIT_CRITICAL();
1227+
tmrEXIT_CRITICAL( &xTaskSpinlock, &xISRSpinlock );
12051228

12061229
traceRETURN_pvTimerGetTimerID( pvReturn );
12071230

@@ -1218,11 +1241,11 @@
12181241

12191242
configASSERT( xTimer );
12201243

1221-
taskENTER_CRITICAL();
1244+
tmrENTER_CRITICAL( &xTaskSpinlock, &xISRSpinlock );
12221245
{
12231246
pxTimer->pvTimerID = pvNewID;
12241247
}
1225-
taskEXIT_CRITICAL();
1248+
tmrEXIT_CRITICAL( &xTaskSpinlock, &xISRSpinlock );
12261249

12271250
traceRETURN_vTimerSetTimerID();
12281251
}

0 commit comments

Comments
 (0)