35#ifndef _AVR_INTERRUPT_H_
36#define _AVR_INTERRUPT_H_
40#if !defined(__DOXYGEN__) && !defined(__STRINGIFY)
42#define __STRINGIFY(x) #x
66#if defined(__DOXYGEN__)
81# define sei() __asm__ __volatile__ ("sei" ::: "memory")
84#if defined(__DOXYGEN__)
99# define cli() __asm__ __volatile__ ("cli" ::: "memory")
106#if defined(__DOXYGEN__)
125# define ISR(vector, [attributes])
128#if (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4)
129# define __INTR_ATTRS used, externally_visible
131# define __INTR_ATTRS used
135# define ISR(vector, ...) \
136 extern "C" void vector (void) __attribute__ ((signal,__INTR_ATTRS)) __VA_ARGS__; \
139# define ISR(vector, ...) \
140 void vector (void) __attribute__ ((signal,__INTR_ATTRS)) __VA_ARGS__; \
146#if defined(__DOXYGEN__)
156# define SIGNAL(vector)
160# define SIGNAL(vector) \
161 extern "C" void vector(void) __attribute__ ((signal, __INTR_ATTRS)); \
164# define SIGNAL(vector) \
165 void vector (void) __attribute__ ((signal, __INTR_ATTRS)); \
171#if defined(__DOXYGEN__)
180# define EMPTY_INTERRUPT(vector)
184# define EMPTY_INTERRUPT(vector) \
185 extern "C" void vector(void) __attribute__ ((signal,naked,__INTR_ATTRS)); \
186 void vector (void) { __asm__ __volatile__ ("reti" ::); }
188# define EMPTY_INTERRUPT(vector) \
189 void vector (void) __attribute__ ((signal,naked,__INTR_ATTRS)); \
190 void vector (void) { __asm__ __volatile__ ("reti" ::); }
195#if defined(__DOXYGEN__)
224# define ISR_ALIAS(vector, target_vector)
228# if defined(__AVR_MEGA__) && __AVR_MEGA__
229# define ISR_ALIAS(vector, tgt) extern "C" void vector (void) \
230 __attribute__((signal, naked, __INTR_ATTRS)); \
231 void vector (void) { asm volatile ("jmp " __STRINGIFY(tgt) ::); }
233# define ISR_ALIAS(vector, tgt) extern "C" void vector (void) \
234 __attribute__((signal, naked, __INTR_ATTRS)); \
235 void vector (void) { asm volatile ("rjmp " __STRINGIFY(tgt) ::); }
238# if defined(__AVR_MEGA__) && __AVR_MEGA__
239# define ISR_ALIAS(vector, tgt) void vector (void) \
240 __attribute__((signal, naked, __INTR_ATTRS)); \
241 void vector (void) { asm volatile ("jmp " __STRINGIFY(tgt) ::); }
243# define ISR_ALIAS(vector, tgt) void vector (void) \
244 __attribute__((signal, naked, __INTR_ATTRS)); \
245 void vector (void) { asm volatile ("rjmp " __STRINGIFY(tgt) ::); }
251#if defined(__DOXYGEN__)
264# define reti() __asm__ __volatile__ ("reti" ::)
267#if defined(__DOXYGEN__)
280# define BADISR_vect __vector_default
285#if defined(__DOXYGEN__)
334# define ISR_ALIASOF(target_vector)
337# define ISR_NOBLOCK __attribute__((interrupt))
338# define ISR_NAKED __attribute__((naked))
339# define ISR_ALIASOF(v) __attribute__((alias(__STRINGIFY(v))))