Fix vTaskSuspendAll assert for critical nesting count

* Accessing the current task's TCB should be performed with interrupt disabled to ensure atomicity.
This commit is contained in:
Ching-Hsin Lee 2024-04-09 22:06:14 +08:00
parent 8afb3a5b82
commit b3628902a9

View file

@ -3830,9 +3830,6 @@ void vTaskSuspendAll( void )
if( xSchedulerRunning != pdFALSE ) if( xSchedulerRunning != pdFALSE )
{ {
/* This must never be called from inside a critical section. */
configASSERT( portGET_CRITICAL_NESTING_COUNT() == 0 );
/* Writes to uxSchedulerSuspended must be protected by both the task AND ISR locks. /* Writes to uxSchedulerSuspended must be protected by both the task AND ISR locks.
* We must disable interrupts before we grab the locks in the event that this task is * We must disable interrupts before we grab the locks in the event that this task is
* interrupted and switches context before incrementing uxSchedulerSuspended. * interrupted and switches context before incrementing uxSchedulerSuspended.
@ -3840,6 +3837,9 @@ void vTaskSuspendAll( void )
* uxSchedulerSuspended since that will prevent context switches. */ * uxSchedulerSuspended since that will prevent context switches. */
ulState = portSET_INTERRUPT_MASK(); ulState = portSET_INTERRUPT_MASK();
/* This must never be called from inside a critical section. */
configASSERT( portGET_CRITICAL_NESTING_COUNT() == 0 );
/* portSOFRWARE_BARRIER() is only implemented for emulated/simulated ports that /* portSOFRWARE_BARRIER() is only implemented for emulated/simulated ports that
* do not otherwise exhibit real time behaviour. */ * do not otherwise exhibit real time behaviour. */
portSOFTWARE_BARRIER(); portSOFTWARE_BARRIER();