@@ -671,7 +671,6 @@ static void prvAddNewTaskToReadyList( TCB_t * pxNewTCB ) PRIVILEGED_FUNCTION;
671
671
static void prvCheckForRunStateChange ( void )
672
672
{
673
673
UBaseType_t uxPrevCriticalNesting ;
674
- UBaseType_t uxPrevSchedulerSuspended ;
675
674
TCB_t * pxThisTCB ;
676
675
677
676
/* This should be skipped if called from an ISR. If the task on the current
@@ -695,24 +694,19 @@ static void prvAddNewTaskToReadyList( TCB_t * pxNewTCB ) PRIVILEGED_FUNCTION;
695
694
* and reacquire the correct locks. And then, do it all over again
696
695
* if our state changed again during the reacquisition. */
697
696
uxPrevCriticalNesting = portGET_CRITICAL_NESTING_COUNT ();
698
- uxPrevSchedulerSuspended = uxSchedulerSuspended ;
699
-
700
- /* This must only be called the first time we enter into a critical
701
- * section, otherwise it could context switch in the middle of a
702
- * critical section. */
703
- configASSERT ( ( uxPrevCriticalNesting + uxPrevSchedulerSuspended ) == 1U );
704
697
705
698
if ( uxPrevCriticalNesting > 0U )
706
699
{
707
700
portSET_CRITICAL_NESTING_COUNT ( 0U );
701
+ portRELEASE_ISR_LOCK ();
708
702
}
709
703
else
710
704
{
711
- portGET_ISR_LOCK ();
712
- uxSchedulerSuspended = 0U ;
705
+ /* The scheduler is suspended. uxSchedulerSuspended is updated
706
+ * only when the task is not requested to yield. */
707
+ mtCOVERAGE_TEST_MARKER ();
713
708
}
714
709
715
- portRELEASE_ISR_LOCK ();
716
710
portRELEASE_TASK_LOCK ();
717
711
718
712
portMEMORY_BARRIER ();
@@ -730,12 +724,9 @@ static void prvAddNewTaskToReadyList( TCB_t * pxNewTCB ) PRIVILEGED_FUNCTION;
730
724
portGET_ISR_LOCK ();
731
725
732
726
portSET_CRITICAL_NESTING_COUNT ( uxPrevCriticalNesting );
733
- uxSchedulerSuspended = uxPrevSchedulerSuspended ;
734
727
735
728
if ( uxPrevCriticalNesting == 0U )
736
729
{
737
- /* uxPrevSchedulerSuspended must be 1. */
738
- configASSERT ( uxPrevSchedulerSuspended != ( UBaseType_t ) pdFALSE );
739
730
portRELEASE_ISR_LOCK ();
740
731
}
741
732
}
@@ -3351,14 +3342,11 @@ void vTaskSuspendAll( void )
3351
3342
portSOFTWARE_BARRIER ();
3352
3343
3353
3344
portGET_TASK_LOCK ();
3354
- portGET_ISR_LOCK ();
3355
-
3356
- /* The scheduler is suspended if uxSchedulerSuspended is non-zero. An increment
3357
- * is used to allow calls to vTaskSuspendAll() to nest. */
3358
- ++ uxSchedulerSuspended ;
3359
- portRELEASE_ISR_LOCK ();
3360
3345
3361
- if ( uxSchedulerSuspended == 1U )
3346
+ /* uxSchedulerSuspended is increased after prvCheckForRunStateChange. The
3347
+ * purpose is to prevent altering the variable when fromISR APIs are readying
3348
+ * it. */
3349
+ if ( uxSchedulerSuspended == 0U )
3362
3350
{
3363
3351
if ( portGET_CRITICAL_NESTING_COUNT () == 0U )
3364
3352
{
@@ -3374,6 +3362,13 @@ void vTaskSuspendAll( void )
3374
3362
mtCOVERAGE_TEST_MARKER ();
3375
3363
}
3376
3364
3365
+ portGET_ISR_LOCK ();
3366
+
3367
+ /* The scheduler is suspended if uxSchedulerSuspended is non-zero. An increment
3368
+ * is used to allow calls to vTaskSuspendAll() to nest. */
3369
+ ++ uxSchedulerSuspended ;
3370
+ portRELEASE_ISR_LOCK ();
3371
+
3377
3372
portCLEAR_INTERRUPT_MASK ( ulState );
3378
3373
}
3379
3374
else
0 commit comments