Skip to content

Commit

Permalink
change(freertos/smp): Update timers.c locking
Browse files Browse the repository at this point in the history
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 taskLOCK/UNLOCK_DATA_GROUP().
  • Loading branch information
Dazza0 authored and sudeep-mohanty committed Oct 23, 2024
1 parent f5f9880 commit 535a88a
Showing 1 changed file with 17 additions and 12 deletions.
29 changes: 17 additions & 12 deletions timers.c
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,11 @@
PRIVILEGED_DATA static QueueHandle_t xTimerQueue = NULL;
PRIVILEGED_DATA static TaskHandle_t xTimerTaskHandle = NULL;

#if ( ( portUSING_GRANULAR_LOCKS == 1 ) && ( configNUMBER_OF_CORES > 1 ) )
PRIVILEGED_DATA static portSPINLOCK_TYPE xTaskSpinlock = portINIT_TIMERS_TASK_SPINLOCK_STATIC;
PRIVILEGED_DATA static portSPINLOCK_TYPE xISRSpinlock = portINIT_TIMERS_ISR_SPINLOCK_STATIC;
#endif /* #if ( ( portUSING_GRANULAR_LOCKS == 1 ) && ( configNUMBER_OF_CORES > 1 ) ) */

/*-----------------------------------------------------------*/

/*
Expand Down Expand Up @@ -576,7 +581,7 @@
traceENTER_vTimerSetReloadMode( xTimer, xAutoReload );

configASSERT( xTimer );
taskENTER_CRITICAL();
taskLOCK_DATA_GROUP( &xTaskSpinlock, &xISRSpinlock );
{
if( xAutoReload != pdFALSE )
{
Expand All @@ -587,7 +592,7 @@
pxTimer->ucStatus &= ( ( uint8_t ) ~tmrSTATUS_IS_AUTORELOAD );
}
}
taskEXIT_CRITICAL();
taskUNLOCK_DATA_GROUP( &xTaskSpinlock, &xISRSpinlock );

traceRETURN_vTimerSetReloadMode();
}
Expand All @@ -601,7 +606,7 @@
traceENTER_xTimerGetReloadMode( xTimer );

configASSERT( xTimer );
portBASE_TYPE_ENTER_CRITICAL();
taskLOCK_DATA_GROUP( &xTaskSpinlock, &xISRSpinlock );
{
if( ( pxTimer->ucStatus & tmrSTATUS_IS_AUTORELOAD ) == 0U )
{
Expand All @@ -614,7 +619,7 @@
xReturn = pdTRUE;
}
}
portBASE_TYPE_EXIT_CRITICAL();
taskUNLOCK_DATA_GROUP( &xTaskSpinlock, &xISRSpinlock );

traceRETURN_xTimerGetReloadMode( xReturn );

Expand Down Expand Up @@ -1113,7 +1118,7 @@
/* Check that the list from which active timers are referenced, and the
* queue used to communicate with the timer service, have been
* initialised. */
taskENTER_CRITICAL();
taskLOCK_DATA_GROUP( &xTaskSpinlock, &xISRSpinlock );
{
if( xTimerQueue == NULL )
{
Expand Down Expand Up @@ -1155,7 +1160,7 @@
mtCOVERAGE_TEST_MARKER();
}
}
taskEXIT_CRITICAL();
taskUNLOCK_DATA_GROUP( &xTaskSpinlock, &xISRSpinlock );
}
/*-----------------------------------------------------------*/

Expand All @@ -1169,7 +1174,7 @@
configASSERT( xTimer );

/* Is the timer in the list of active timers? */
portBASE_TYPE_ENTER_CRITICAL();
taskLOCK_DATA_GROUP( &xTaskSpinlock, &xISRSpinlock );
{
if( ( pxTimer->ucStatus & tmrSTATUS_IS_ACTIVE ) == 0U )
{
Expand All @@ -1180,7 +1185,7 @@
xReturn = pdTRUE;
}
}
portBASE_TYPE_EXIT_CRITICAL();
taskUNLOCK_DATA_GROUP( &xTaskSpinlock, &xISRSpinlock );

traceRETURN_xTimerIsTimerActive( xReturn );

Expand All @@ -1197,11 +1202,11 @@

configASSERT( xTimer );

taskENTER_CRITICAL();
taskLOCK_DATA_GROUP( &xTaskSpinlock, &xISRSpinlock );
{
pvReturn = pxTimer->pvTimerID;
}
taskEXIT_CRITICAL();
taskUNLOCK_DATA_GROUP( &xTaskSpinlock, &xISRSpinlock );

traceRETURN_pvTimerGetTimerID( pvReturn );

Expand All @@ -1218,11 +1223,11 @@

configASSERT( xTimer );

taskENTER_CRITICAL();
taskLOCK_DATA_GROUP( &xTaskSpinlock, &xISRSpinlock );
{
pxTimer->pvTimerID = pvNewID;
}
taskEXIT_CRITICAL();
taskUNLOCK_DATA_GROUP( &xTaskSpinlock, &xISRSpinlock );

traceRETURN_vTimerSetTimerID();
}
Expand Down

0 comments on commit 535a88a

Please sign in to comment.