|
79 | 79 | #define tmrSTATUS_IS_STATICALLY_ALLOCATED ( 0x02U )
|
80 | 80 | #define tmrSTATUS_IS_AUTORELOAD ( 0x04U )
|
81 | 81 |
|
| 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 | + |
82 | 100 | /* The definition of the timers themselves. */
|
83 | 101 | typedef struct tmrTimerControl /* The old naming convention is used to prevent breaking kernel aware debuggers. */
|
84 | 102 | {
|
|
149 | 167 | PRIVILEGED_DATA static QueueHandle_t xTimerQueue = NULL;
|
150 | 168 | PRIVILEGED_DATA static TaskHandle_t xTimerTaskHandle = NULL;
|
151 | 169 |
|
| 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 | + |
152 | 175 | /*-----------------------------------------------------------*/
|
153 | 176 |
|
154 | 177 | /*
|
|
576 | 599 | traceENTER_vTimerSetReloadMode( xTimer, xAutoReload );
|
577 | 600 |
|
578 | 601 | configASSERT( xTimer );
|
579 |
| - taskENTER_CRITICAL(); |
| 602 | + tmrENTER_CRITICAL( &xTaskSpinlock, &xISRSpinlock ); |
580 | 603 | {
|
581 | 604 | if( xAutoReload != pdFALSE )
|
582 | 605 | {
|
|
587 | 610 | pxTimer->ucStatus &= ( ( uint8_t ) ~tmrSTATUS_IS_AUTORELOAD );
|
588 | 611 | }
|
589 | 612 | }
|
590 |
| - taskEXIT_CRITICAL(); |
| 613 | + tmrEXIT_CRITICAL( &xTaskSpinlock, &xISRSpinlock ); |
591 | 614 |
|
592 | 615 | traceRETURN_vTimerSetReloadMode();
|
593 | 616 | }
|
|
601 | 624 | traceENTER_xTimerGetReloadMode( xTimer );
|
602 | 625 |
|
603 | 626 | configASSERT( xTimer );
|
604 |
| - portBASE_TYPE_ENTER_CRITICAL(); |
| 627 | + tmrENTER_CRITICAL( &xTaskSpinlock, &xISRSpinlock ); |
605 | 628 | {
|
606 | 629 | if( ( pxTimer->ucStatus & tmrSTATUS_IS_AUTORELOAD ) == 0U )
|
607 | 630 | {
|
|
614 | 637 | xReturn = pdTRUE;
|
615 | 638 | }
|
616 | 639 | }
|
617 |
| - portBASE_TYPE_EXIT_CRITICAL(); |
| 640 | + tmrEXIT_CRITICAL( &xTaskSpinlock, &xISRSpinlock ); |
618 | 641 |
|
619 | 642 | traceRETURN_xTimerGetReloadMode( xReturn );
|
620 | 643 |
|
|
1113 | 1136 | /* Check that the list from which active timers are referenced, and the
|
1114 | 1137 | * queue used to communicate with the timer service, have been
|
1115 | 1138 | * initialised. */
|
1116 |
| - taskENTER_CRITICAL(); |
| 1139 | + tmrENTER_CRITICAL( &xTaskSpinlock, &xISRSpinlock ); |
1117 | 1140 | {
|
1118 | 1141 | if( xTimerQueue == NULL )
|
1119 | 1142 | {
|
|
1155 | 1178 | mtCOVERAGE_TEST_MARKER();
|
1156 | 1179 | }
|
1157 | 1180 | }
|
1158 |
| - taskEXIT_CRITICAL(); |
| 1181 | + tmrEXIT_CRITICAL( &xTaskSpinlock, &xISRSpinlock ); |
1159 | 1182 | }
|
1160 | 1183 | /*-----------------------------------------------------------*/
|
1161 | 1184 |
|
|
1169 | 1192 | configASSERT( xTimer );
|
1170 | 1193 |
|
1171 | 1194 | /* Is the timer in the list of active timers? */
|
1172 |
| - portBASE_TYPE_ENTER_CRITICAL(); |
| 1195 | + tmrENTER_CRITICAL( &xTaskSpinlock, &xISRSpinlock ); |
1173 | 1196 | {
|
1174 | 1197 | if( ( pxTimer->ucStatus & tmrSTATUS_IS_ACTIVE ) == 0U )
|
1175 | 1198 | {
|
|
1180 | 1203 | xReturn = pdTRUE;
|
1181 | 1204 | }
|
1182 | 1205 | }
|
1183 |
| - portBASE_TYPE_EXIT_CRITICAL(); |
| 1206 | + tmrEXIT_CRITICAL( &xTaskSpinlock, &xISRSpinlock ); |
1184 | 1207 |
|
1185 | 1208 | traceRETURN_xTimerIsTimerActive( xReturn );
|
1186 | 1209 |
|
|
1197 | 1220 |
|
1198 | 1221 | configASSERT( xTimer );
|
1199 | 1222 |
|
1200 |
| - taskENTER_CRITICAL(); |
| 1223 | + tmrENTER_CRITICAL( &xTaskSpinlock, &xISRSpinlock ); |
1201 | 1224 | {
|
1202 | 1225 | pvReturn = pxTimer->pvTimerID;
|
1203 | 1226 | }
|
1204 |
| - taskEXIT_CRITICAL(); |
| 1227 | + tmrEXIT_CRITICAL( &xTaskSpinlock, &xISRSpinlock ); |
1205 | 1228 |
|
1206 | 1229 | traceRETURN_pvTimerGetTimerID( pvReturn );
|
1207 | 1230 |
|
|
1218 | 1241 |
|
1219 | 1242 | configASSERT( xTimer );
|
1220 | 1243 |
|
1221 |
| - taskENTER_CRITICAL(); |
| 1244 | + tmrENTER_CRITICAL( &xTaskSpinlock, &xISRSpinlock ); |
1222 | 1245 | {
|
1223 | 1246 | pxTimer->pvTimerID = pvNewID;
|
1224 | 1247 | }
|
1225 |
| - taskEXIT_CRITICAL(); |
| 1248 | + tmrEXIT_CRITICAL( &xTaskSpinlock, &xISRSpinlock ); |
1226 | 1249 |
|
1227 | 1250 | traceRETURN_vTimerSetTimerID();
|
1228 | 1251 | }
|
|
0 commit comments