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 <jay2002824@gmail.com>
diff --git a/.github/.cSpellWords.txt b/.github/.cSpellWords.txt
index 9e0f656..49a91c3 100644
--- a/.github/.cSpellWords.txt
+++ b/.github/.cSpellWords.txt
@@ -59,6 +59,7 @@
brne
bswtrg
BSWTRG
+Bytesto
CANEN
CANRX
CANTX
@@ -89,13 +90,16 @@
CKLO
CKPS
CLDIV
+CLEARINTENA
CLKA
CLKB
+CLKDIS
CLKEN
clki
CLKI
CLKP
CLKS
+CLKSOURCE
CLKSTA
CLRB
CLRF
@@ -690,6 +694,7 @@
RTAR
RTCEN
RTCSC
+RTICTL
RTIE
RTIF
RTIFRC
@@ -713,6 +718,7 @@
RXSETUP
RXSUSP
RXSYN
+RXTDIS
RXTEN
RXUBR
SBYCR
@@ -726,6 +732,7 @@
SENDA
SETB
SETEN
+SETINTENA
SETPSW
SETR
setvect
@@ -849,6 +856,7 @@
TXVDIS
UDCP
uncrustify
+UNDADD
UNRE
unsuspended
URAD
@@ -867,6 +875,7 @@
vect
VECT
VECTACTIVE
+VECTKEY
visualisation
vldmdbeq
vldmia
diff --git a/include/FreeRTOS.h b/include/FreeRTOS.h
index 23526bb..6eb498c 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 8feb652..ef487b4 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 e40af66..05386c3 100644
--- a/portable/GCC/RISC-V/portmacro.h
+++ b/portable/GCC/RISC-V/portmacro.h
@@ -111,9 +111,6 @@
/* 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 eba9eb6..9a9141c 100644
--- a/portable/IAR/RISC-V/portmacro.h
+++ b/portable/IAR/RISC-V/portmacro.h
@@ -113,9 +113,6 @@
/* 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 06f2b75..82da953 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.
*/