43 #define QK_IRQ_BEGIN(name_) \
45 __attribute__ ((interrupt ("irq"))); \
46 __attribute__ ((naked)) void name_(void) { \
47 __asm volatile (" SUB LR, LR, #4\n" \
50 " PUSH {R0-R3, R12}"); \
51 __asm(" FMRX R12, FPSCR\n" \
52 " STMFD SP!, {R12}\n" \
53 " FMRX R12, FPEXC\n" \
54 " STMFD SP!, {R12}\n" \
55 " FSTMDBD SP!, {D0-D7}"); \
56 __asm(" AND R3, SP, #4\n" \
58 " PUSH {R3, LR}\n"); \
61 #define QK_IRQ_BEGIN(name_) \
63 __attribute__ ((target ("arm"))); \
64 __attribute__ ((naked)) void name_(void) { \
65 __asm volatile (" SUB LR, LR, #4\n" \
68 " PUSH {R0-R3, R12}"); \
69 __asm(" AND R3, SP, #4\n" \
71 " PUSH {R3, LR}\n"); \
77 #define QK_IRQ_END() \
78 } --QK_attr_.intNest; \
79 if (QK_attr_.intNest == (uint_fast8_t)0) { \
80 if (QK_sched_() != (uint_fast8_t)0) { \
84 __asm volatile (" POP {R3, LR}\n" \
86 __asm(" FLDMIAD SP!, {D0-D7}\n" \
87 " LDMFD SP!, {R12}\n" \
88 " FMXR FPEXC, R12 \n" \
89 " LDMFD SP!, {R12} \n" \
90 " FMXR FPSCR, R12"); \
91 __asm(" POP {R0-R3, R12}\n" \
95 #define QK_IRQ_END() \
96 } --QK_attr_.intNest; \
97 if (QK_attr_.intNest == (uint_fast8_t)0) { \
98 if (QK_sched_() != (uint_fast8_t)0) { \
102 __asm volatile (" POP {R3, LR}\n" \
103 " ADD SP, SP, R3"); \
104 __asm volatile (" POP {R0-R3, R12}\n" \
QK/C++ platform-independent public interface.