1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00
RIOT/cpu/msp430_common/include/irq_arch.h
Marian Buschsieweke 008e2d3b97
cpu/msp430_common: Prevent conflicting defines
irq_arch.h previously included cpu.h, which in term included the vendor header
files. Those were needed to get the GIE define (general interrupt enable bit).
However, the vendor files use fancy defines like `#define N (0x0004)` that
easily conflict with application code. Due to the widespread use of the IRQ API,
it is better to not include the vendor files in irq_arch.h.

This commit adds a local define for the GIE bit and uses this instead of
including cpu.h.
2020-11-06 21:10:19 +01:00

97 lines
2.3 KiB
C

/*
* Copyright (C) 2014 Freie Universität Berlin
* 2020 Otto-von-Guericke-Universität Magdeburg
*
* This file is subject to the terms and conditions of the GNU Lesser
* General Public License v2.1. See the file LICENSE in the top level
* directory for more details.
*/
/**
* @ingroup cpu_msp430_common
* @{
*
* @file
* @brief ISR related functions
*
* @author Kaspar Schleiser <kaspar@schleiser.de>
* @author Oliver Hahm <oliver.hahm@inria.fr>
* @author Marian Buschsieweke <marian.buschsieweke@ovgu.de>
*
*/
#ifndef IRQ_ARCH_H
#define IRQ_ARCH_H
#include "irq.h"
#ifdef __cplusplus
extern "C" {
#endif
/*
* gcc warns for missing NOPs before/after interrupt enable/disable.
* so I added the NOP instructions, even though they might not be necessary
* due to following AND. // Kaspar
*/
extern volatile int __irq_is_in;
#define _GENERAL_INTERRUPT_ENABLE (0x0008)
__attribute__((always_inline)) static inline unsigned int irq_disable(void)
{
unsigned int state;
__asm__ volatile(
"mov.w r2, %[state]" "\n\t"
"bic %[gie], r2" "\n\t"
"nop" "\n\t"
"and %[gie], %[state]" "\n\t"
: [state] "=r"(state)
: [gie] "i"(_GENERAL_INTERRUPT_ENABLE)
: "memory"
);
return state;
}
__attribute__((always_inline)) static inline unsigned int irq_enable(void)
{
unsigned int state;
__asm__ volatile(
"mov.w r2, %[state]" "\n\t"
"nop" "\n\t"
"bis %[gie], r2" "\n\t"
"nop" "\n\t"
"and %[gie], %[state]" "\n\t"
: [state] "=r"(state)
: [gie] "i"(_GENERAL_INTERRUPT_ENABLE)
: "memory"
);
return state;
}
__attribute__((always_inline)) static inline void irq_restore(unsigned int state)
{
__asm__ volatile(
"bis %[state], r2" "\n\t"
"nop" "\n\t"
: /* no outputs */
: [state] "r"(state)
: "memory"
);
}
__attribute__((always_inline)) static inline int irq_is_in(void)
{
return __irq_is_in;
}
#ifdef __cplusplus
}
#endif
/** @} */
#endif /* IRQ_ARCH_H */