Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/FreeRTOS/FreeRTOS-Kernel.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorchinglee-iot <61685396+chinglee-iot@users.noreply.github.com>2024-01-03 10:47:05 +0300
committerGitHub <noreply@github.com>2024-01-03 10:47:05 +0300
commitbe880a1fc8ed4e9bc8110e85bbc827952a13a087 (patch)
tree9568b6edfe0bdcc6f155910a421be410448ed626
parent75c4044b7e58853065106078b5a1c46df8bef2a6 (diff)
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>
-rw-r--r--.github/.cSpellWords.txt9
-rw-r--r--include/FreeRTOS.h28
-rw-r--r--include/atomic.h10
-rw-r--r--portable/GCC/RISC-V/portmacro.h3
-rw-r--r--portable/IAR/RISC-V/portmacro.h3
-rw-r--r--portable/ThirdParty/xClang/XCOREAI/portmacro.h3
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.
*/