From be880a1fc8ed4e9bc8110e85bbc827952a13a087 Mon Sep 17 00:00:00 2001 From: chinglee-iot <61685396+chinglee-iot@users.noreply.github.com> Date: Wed, 3 Jan 2024 15:47:05 +0800 Subject: Fix portSET_INTERRUPT_MASK_FROM_ISR definition for atomic operation (#940) * Introduce portHAS_NESTED_INTERRUPTS to identify if port has nested interrupt or not. * Update atomic.h to use portHAS_NESTED_INTERRUPTS instead of portSET_INTERRUPT_MASK_FROM_ISR definition. --------- Co-authored-by: Gaurav-Aggarwal-AWS <33462878+aggarg@users.noreply.github.com> Co-authored-by: ActoryOu --- .github/.cSpellWords.txt | 9 +++++++++ include/FreeRTOS.h | 28 ++++++++++++++++++++++++-- include/atomic.h | 10 ++++++++- portable/GCC/RISC-V/portmacro.h | 3 --- portable/IAR/RISC-V/portmacro.h | 3 --- portable/ThirdParty/xClang/XCOREAI/portmacro.h | 3 --- 6 files changed, 44 insertions(+), 12 deletions(-) diff --git a/.github/.cSpellWords.txt b/.github/.cSpellWords.txt index 9e0f6560b..49a91c351 100644 --- a/.github/.cSpellWords.txt +++ b/.github/.cSpellWords.txt @@ -59,6 +59,7 @@ brhi brne bswtrg BSWTRG +Bytesto CANEN CANRX CANTX @@ -89,13 +90,16 @@ CKGR CKLO CKPS CLDIV +CLEARINTENA CLKA CLKB +CLKDIS CLKEN clki CLKI CLKP CLKS +CLKSOURCE CLKSTA CLRB CLRF @@ -690,6 +694,7 @@ Rsvd RTAR RTCEN RTCSC +RTICTL RTIE RTIF RTIFRC @@ -713,6 +718,7 @@ RXRSM RXSETUP RXSUSP RXSYN +RXTDIS RXTEN RXUBR SBYCR @@ -726,6 +732,7 @@ SECU SENDA SETB SETEN +SETINTENA SETPSW SETR setvect @@ -849,6 +856,7 @@ TXVC TXVDIS UDCP uncrustify +UNDADD UNRE unsuspended URAD @@ -867,6 +875,7 @@ VDDCORE vect VECT VECTACTIVE +VECTKEY visualisation vldmdbeq vldmia diff --git a/include/FreeRTOS.h b/include/FreeRTOS.h index 23526bb02..6eb498cd2 100644 --- a/include/FreeRTOS.h +++ b/include/FreeRTOS.h @@ -509,12 +509,36 @@ #endif /* configUSE_TIMERS */ +#ifndef portHAS_NESTED_INTERRUPTS + #if defined( portSET_INTERRUPT_MASK_FROM_ISR ) && defined( portCLEAR_INTERRUPT_MASK_FROM_ISR ) + #define portHAS_NESTED_INTERRUPTS 1 + #else + #define portHAS_NESTED_INTERRUPTS 0 + #endif +#endif + #ifndef portSET_INTERRUPT_MASK_FROM_ISR - #define portSET_INTERRUPT_MASK_FROM_ISR() 0 + #if ( portHAS_NESTED_INTERRUPTS == 1 ) + #error portSET_INTERRUPT_MASK_FROM_ISR must be defined for ports that support nested interrupts (i.e. portHAS_NESTED_INTERRUPTS is set to 1) + #else + #define portSET_INTERRUPT_MASK_FROM_ISR() 0 + #endif +#else + #if ( portHAS_NESTED_INTERRUPTS == 0 ) + #error portSET_INTERRUPT_MASK_FROM_ISR must not be defined for ports that do not support nested interrupts (i.e. portHAS_NESTED_INTERRUPTS is set to 0) + #endif #endif #ifndef portCLEAR_INTERRUPT_MASK_FROM_ISR - #define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedStatusValue ) ( void ) ( uxSavedStatusValue ) + #if ( portHAS_NESTED_INTERRUPTS == 1 ) + #error portCLEAR_INTERRUPT_MASK_FROM_ISR must be defined for ports that support nested interrupts (i.e. portHAS_NESTED_INTERRUPTS is set to 1) + #else + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedStatusValue ) ( void ) ( uxSavedStatusValue ) + #endif +#else + #if ( portHAS_NESTED_INTERRUPTS == 0 ) + #error portCLEAR_INTERRUPT_MASK_FROM_ISR must not be defined for ports that do not support nested interrupts (i.e. portHAS_NESTED_INTERRUPTS is set to 0) + #endif #endif #ifndef portCLEAN_UP_TCB diff --git a/include/atomic.h b/include/atomic.h index 8feb65250..ef487b4ab 100644 --- a/include/atomic.h +++ b/include/atomic.h @@ -33,6 +33,14 @@ * This file implements atomic functions by disabling interrupts globally. * Implementations with architecture specific atomic instructions can be * provided under each compiler directory. + * + * The atomic interface can be used in FreeRTOS tasks on all FreeRTOS ports. It + * can also be used in Interrupt Service Routines (ISRs) on FreeRTOS ports that + * support nested interrupts (i.e. portHAS_NESTED_INTERRUPTS is set to 1). The + * atomic interface must not be used in ISRs on FreeRTOS ports that do not + * support nested interrupts (i.e. portHAS_NESTED_INTERRUPTS is set to 0) + * because ISRs on these ports cannot be interrupted and therefore, do not need + * atomics in ISRs. */ #ifndef ATOMIC_H @@ -59,7 +67,7 @@ * ATOMIC_ENTER_CRITICAL(). * */ -#if defined( portSET_INTERRUPT_MASK_FROM_ISR ) +#if ( portHAS_NESTED_INTERRUPTS == 1 ) /* Nested interrupt scheme is supported in this port. */ #define ATOMIC_ENTER_CRITICAL() \ diff --git a/portable/GCC/RISC-V/portmacro.h b/portable/GCC/RISC-V/portmacro.h index e40af6639..05386c3d9 100644 --- a/portable/GCC/RISC-V/portmacro.h +++ b/portable/GCC/RISC-V/portmacro.h @@ -111,9 +111,6 @@ extern void vTaskSwitchContext( void ); /* Critical section management. */ #define portCRITICAL_NESTING_IN_TCB 0 -#define portSET_INTERRUPT_MASK_FROM_ISR() 0 -#define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedStatusValue ) ( void ) uxSavedStatusValue - #define portDISABLE_INTERRUPTS() __asm volatile ( "csrc mstatus, 8" ) #define portENABLE_INTERRUPTS() __asm volatile ( "csrs mstatus, 8" ) diff --git a/portable/IAR/RISC-V/portmacro.h b/portable/IAR/RISC-V/portmacro.h index eba9eb6f2..9a9141c58 100644 --- a/portable/IAR/RISC-V/portmacro.h +++ b/portable/IAR/RISC-V/portmacro.h @@ -113,9 +113,6 @@ extern void vTaskSwitchContext( void ); /* Critical section management. */ #define portCRITICAL_NESTING_IN_TCB 0 -#define portSET_INTERRUPT_MASK_FROM_ISR() 0 -#define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedStatusValue ) ( void ) uxSavedStatusValue - #define portDISABLE_INTERRUPTS() __disable_interrupt() #define portENABLE_INTERRUPTS() __enable_interrupt() diff --git a/portable/ThirdParty/xClang/XCOREAI/portmacro.h b/portable/ThirdParty/xClang/XCOREAI/portmacro.h index 06f2b75dc..82da95314 100644 --- a/portable/ThirdParty/xClang/XCOREAI/portmacro.h +++ b/portable/ThirdParty/xClang/XCOREAI/portmacro.h @@ -139,9 +139,6 @@ #define portSET_INTERRUPT_MASK() rtos_interrupt_mask_all() #define portCLEAR_INTERRUPT_MASK( ulState ) rtos_interrupt_mask_set( ulState ) - #define portSET_INTERRUPT_MASK_FROM_ISR() ( 0 ) - #define portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) ( ( void ) x ) - /* * Will enable interrupts if ulState is non-zero. */ -- cgit v1.2.3