summaryrefslogtreecommitdiff
path: root/nuttx/arch/arm/include/armv7-m
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2013-01-22 01:25:40 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2013-01-22 01:25:40 +0000
commitfefa8ee3353d5ac7ef0e925ba8dcbbb89f2c96ae (patch)
treea1914fb5c45a61232078c98064198ac8818f07b4 /nuttx/arch/arm/include/armv7-m
parentc86261aac88dcc280ca37e532ba96435c1c54699 (diff)
downloadnuttx-fefa8ee3353d5ac7ef0e925ba8dcbbb89f2c96ae.tar.gz
nuttx-fefa8ee3353d5ac7ef0e925ba8dcbbb89f2c96ae.tar.bz2
nuttx-fefa8ee3353d5ac7ef0e925ba8dcbbb89f2c96ae.zip
Add option to use BASEPRI instead of PRIMASK to disable interrupts in all ARMv7-M architectures
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@5546 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'nuttx/arch/arm/include/armv7-m')
-rw-r--r--nuttx/arch/arm/include/armv7-m/irq.h141
1 files changed, 83 insertions, 58 deletions
diff --git a/nuttx/arch/arm/include/armv7-m/irq.h b/nuttx/arch/arm/include/armv7-m/irq.h
index 606b3988f..9491e57c0 100644
--- a/nuttx/arch/arm/include/armv7-m/irq.h
+++ b/nuttx/arch/arm/include/armv7-m/irq.h
@@ -60,6 +60,10 @@
# include <arch/armv7-m/irq_lazyfpu.h>
#endif
+#ifdef CONFIG_ARMV7M_USEBASEPRI
+# include <arch/chip/chip.h>
+#endif
+
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
@@ -130,64 +134,6 @@ struct xcptcontext
#ifndef __ASSEMBLY__
-/* Disable IRQs */
-
-static inline void irqdisable(void) inline_function;
-static inline void irqdisable(void)
-{
- __asm__ __volatile__ ("\tcpsid i\n");
-}
-
-/* Save the current primask state & disable IRQs */
-
-static inline irqstate_t irqsave(void) inline_function;
-static inline irqstate_t irqsave(void)
-{
- unsigned short primask;
-
- /* Return the current value of primask register and set
- * bit 0 of the primask register to disable interrupts
- */
-
- __asm__ __volatile__
- (
- "\tmrs %0, primask\n"
- "\tcpsid i\n"
- : "=r" (primask)
- :
- : "memory");
-
- return primask;
-}
-
-/* Enable IRQs */
-
-static inline void irqenable(void) inline_function;
-static inline void irqenable(void)
-{
- __asm__ __volatile__ ("\tcpsie i\n");
-}
-
-/* Restore saved primask state */
-
-static inline void irqrestore(irqstate_t primask) inline_function;
-static inline void irqrestore(irqstate_t primask)
-{
- /* If bit 0 of the primask is 0, then we need to restore
- * interupts.
- */
-
- __asm__ __volatile__
- (
- "\ttst %0, #1\n"
- "\tbne 1f\n"
- "\tcpsie i\n"
- "1:\n"
- :
- : "r" (primask)
- : "memory");
-}
-
/* Get/set the primask register */
static inline uint8_t getprimask(void) inline_function;
@@ -243,6 +189,85 @@ static inline void setbasepri(uint32_t basepri)
: "memory");
}
+/* Disable IRQs */
+
+static inline void irqdisable(void) inline_function;
+static inline void irqdisable(void)
+{
+#ifdef CONFIG_ARMV7M_USEBASEPRI
+ setbasepri(NVIC_SYSH_DISABLE_PRIORITY);
+#else
+ __asm__ __volatile__ ("\tcpsid i\n");
+#endif
+}
+
+/* Save the current primask state & disable IRQs */
+
+static inline irqstate_t irqsave(void) inline_function;
+static inline irqstate_t irqsave(void)
+{
+#ifdef CONFIG_ARMV7M_USEBASEPRI
+
+ uint8_t basepri = getbasepri();
+ setbasepri(NVIC_SYSH_DISABLE_PRIORITY);
+ return basepri;
+
+#else
+
+ unsigned short primask;
+
+ /* Return the current value of primask register and set
+ * bit 0 of the primask register to disable interrupts
+ */
+
+ __asm__ __volatile__
+ (
+ "\tmrs %0, primask\n"
+ "\tcpsid i\n"
+ : "=r" (primask)
+ :
+ : "memory");
+
+ return primask;
+#endif
+}
+
+/* Enable IRQs */
+
+static inline void irqenable(void) inline_function;
+static inline void irqenable(void)
+{
+#ifdef CONFIG_ARMV7M_USEBASEPRI
+ setbasepri(NVIC_SYSH_PRIORITY_MIN);
+#else
+ __asm__ __volatile__ ("\tcpsie i\n");
+#endif
+}
+
+/* Restore saved primask state */
+
+static inline void irqrestore(irqstate_t flags) inline_function;
+static inline void irqrestore(irqstate_t flags)
+{
+#ifdef CONFIG_ARMV7M_USEBASEPRI
+ setbasepri(flags);
+#else
+ /* If bit 0 of the primask is 0, then we need to restore
+ * interupts.
+ */
+
+ __asm__ __volatile__
+ (
+ "\ttst %0, #1\n"
+ "\tbne 1f\n"
+ "\tcpsie i\n"
+ "1:\n"
+ :
+ : "r" (flags)
+ : "memory");
+#endif
+}
+
/* Get/set IPSR */
static inline uint32_t getipsr(void) inline_function;