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" ::: "memory"); }
188# define EMPTY_INTERRUPT(vector) \
189 void vector (void) __attribute__ ((__signal__,__naked__,__INTR_ATTRS)); \
190 void vector (void) { __asm__ __volatile__ ("reti" ::: "memory"); }
195#if defined(__DOXYGEN__)
224# define ISR_ALIAS(vector, target_vector)
228# define ISR_ALIAS(vector, tgt) extern "C" void vector (void) \
229 __attribute__((__signal__, __naked__, __INTR_ATTRS)); \
230 void vector (void) { __asm__ __volatile__ ("%~jmp " __STRINGIFY(tgt) ::); }
232# define ISR_ALIAS(vector, tgt) void vector (void) \
233 __attribute__((__signal__, __naked__, __INTR_ATTRS)); \
234 void vector (void) { __asm__ __volatile__ ("%~jmp " __STRINGIFY(tgt) ::); }
239#if defined(__DOXYGEN__)
252# define reti() __asm__ __volatile__ ("reti" ::: "memory")
255#if defined(__DOXYGEN__)
268# define BADISR_vect __vector_default
273#if defined(__DOXYGEN__)
351# define ISR_ALIASOF(target_vector)
356# define ISR_NOBLOCK __attribute__((__interrupt__))
357# define ISR_NAKED __attribute__((__naked__))
359#if (__GNUC__ == 4 && __GNUC_MINOR__ >= 6) || (__GNUC__ >= 5)
360# define ISR_FLATTEN __attribute__((__flatten__))
365#if defined (__has_attribute)
366#if __has_attribute (__no_icf__)
367# define ISR_NOICF __attribute__((__no_icf__))
373# define ISR_ALIASOF(v) __attribute__((__alias__(__STRINGIFY(v))))