Merge branch 'fix/incorrect_critical_nesting_count_in_linux_port_v5.3' into 'release/v5.3'

fix(freertos): Fixed critical section macro in vTaskPlaceOnEventListRestricted() (v5.3)

See merge request espressif/esp-idf!32742
This commit is contained in:
Jiang Jiang Jian 2024-09-06 10:29:14 +08:00
commit f3dc731015
6 changed files with 31 additions and 2 deletions

View File

@ -90,8 +90,13 @@ void vPortEnterCritical(void)
void vPortExitCritical(void)
{
/* Critical section nesting coung must never be negative */
configASSERT( port_uxCriticalNestingIDF > 0 );
if (port_uxCriticalNestingIDF > 0) {
port_uxCriticalNestingIDF--;
if (port_uxCriticalNestingIDF == 0) {
// Restore the saved interrupt threshold
vPortClearInterruptMask((int)port_uxCriticalOldInterruptStateIDF);

View File

@ -145,9 +145,14 @@ void vPortExitCriticalIDF(portMUX_TYPE *lock)
spinlock_release(lock);
BaseType_t coreID = xPortGetCoreID();
BaseType_t nesting = port_uxCriticalNestingIDF[coreID];
/* Critical section nesting count must never be negative */
configASSERT( nesting > 0 );
if (nesting > 0) {
nesting--;
port_uxCriticalNestingIDF[coreID] = nesting;
//This is the last exit call, restore the saved interrupt level
if ( nesting == 0 ) {
XTOS_RESTORE_JUST_INTLEVEL((int) port_uxCriticalOldInterruptStateIDF[coreID]);

View File

@ -261,7 +261,13 @@ void vPortEnterCritical( void )
void vPortExitCritical( void )
{
uxCriticalNesting--;
if ( uxCriticalNesting > 0 )
{
uxCriticalNesting--;
}
/* Critical section nesting count must always be >= 0. */
configASSERT( uxCriticalNesting >= 0 );
/* If we have reached 0 then re-enable the interrupts. */
if( uxCriticalNesting == 0 )

View File

@ -568,9 +568,13 @@ void __attribute__((optimize("-O3"))) vPortExitCriticalMultiCore(portMUX_TYPE *m
BaseType_t coreID = xPortGetCoreID();
BaseType_t nesting = port_uxCriticalNesting[coreID];
/* Critical section nesting count must never be negative */
configASSERT( nesting > 0 );
if (nesting > 0) {
nesting--;
port_uxCriticalNesting[coreID] = nesting;
//This is the last exit call, restore the saved interrupt level
if ( nesting == 0 ) {
portCLEAR_INTERRUPT_MASK_FROM_ISR(port_uxOldInterruptState[coreID]);
@ -623,8 +627,13 @@ void vPortExitCritical(void)
esp_rom_printf("vPortExitCritical(void) is not supported on single-core targets. Please use vPortExitCriticalMultiCore(portMUX_TYPE *mux) instead.\n");
abort();
#endif /* (configNUM_CORES > 1) */
/* Critical section nesting count must never be negative */
configASSERT( port_uxCriticalNesting[0] > 0 );
if (port_uxCriticalNesting[0] > 0) {
port_uxCriticalNesting[0]--;
if (port_uxCriticalNesting[0] == 0) {
portCLEAR_INTERRUPT_MASK_FROM_ISR(port_uxOldInterruptState[0]);
}

View File

@ -497,9 +497,13 @@ void __attribute__((optimize("-O3"))) vPortExitCritical(portMUX_TYPE *mux)
BaseType_t coreID = xPortGetCoreID();
BaseType_t nesting = port_uxCriticalNesting[coreID];
/* Critical section nesting count must never be negative */
configASSERT( nesting > 0 );
if (nesting > 0) {
nesting--;
port_uxCriticalNesting[coreID] = nesting;
//This is the last exit call, restore the saved interrupt level
if ( nesting == 0 ) {
portCLEAR_INTERRUPT_MASK_FROM_ISR(port_uxOldInterruptState[coreID]);

View File

@ -3856,7 +3856,7 @@ void vTaskPlaceOnUnorderedEventList( List_t * pxEventList,
prvAddCurrentTaskToDelayedList( xTicksToWait, xWaitIndefinitely );
}
/* Release the previously taken kernel lock. */
taskEXIT_CRITICAL( &xKernelLock );
prvEXIT_CRITICAL_SMP_ONLY( &xKernelLock );
}
#endif /* configUSE_TIMERS */