projects
/
bertos.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
ARM7TDMI: get rid of gcc's __attribute__((interrupt)).
[bertos.git]
/
bertos
/
cpu
/
irq.h
diff --git
a/bertos/cpu/irq.h
b/bertos/cpu/irq.h
index 40571142bc33d3bb7be821c185b18099dafa4728..6eac70fdea50424752119224ac1165fc794f3a50 100644
(file)
--- a/
bertos/cpu/irq.h
+++ b/
bertos/cpu/irq.h
@@
-286,7
+286,7
@@
sreg; \
})
sreg; \
})
- #define IRQ_ENABLED() (
!(CPU_READ_FLAGS() & 0x80)
)
+ #define IRQ_ENABLED() (
(CPU_READ_FLAGS() & 0xc0) != 0xc0
)
#if CONFIG_KERN_PREEMPT
EXTERN_C void asm_irq_switch_context(void);
#if CONFIG_KERN_PREEMPT
EXTERN_C void asm_irq_switch_context(void);
@@
-350,7
+350,7
@@
__isr_##func(); \
IRQ_EXIT(); \
} \
__isr_##func(); \
IRQ_EXIT(); \
} \
- static void __isr_##func(void)
+ static
NOINLINE
void __isr_##func(void)
/**
* Interrupt service routine prototype: can be used for
* forward declarations.
/**
* Interrupt service routine prototype: can be used for
* forward declarations.
@@
-377,7
+377,7
@@
#endif /* CONFIG_KERN_PREEMPT */
#ifndef ISR_FUNC
#endif /* CONFIG_KERN_PREEMPT */
#ifndef ISR_FUNC
- #define ISR_FUNC
__attribute__((interrupt
))
+ #define ISR_FUNC
__attribute__((naked
))
#endif
#ifndef DECLARE_ISR
#define DECLARE_ISR(func) \
#endif
#ifndef DECLARE_ISR
#define DECLARE_ISR(func) \
@@
-394,9
+394,14
@@
static NOINLINE void __isr_##func(void); \
void ISR_FUNC func(void) \
{ \
static NOINLINE void __isr_##func(void); \
void ISR_FUNC func(void) \
{ \
+ asm volatile ( \
+ "sub lr, lr, #4\n\t" \
+ "stmfd sp!, {r0-r3, ip, lr}\n\t"); \
__isr_##func(); \
__isr_##func(); \
+ asm volatile ( \
+ "ldmfd sp!, {r0-r3, ip, pc}^\n\t"); \
} \
} \
- static void __isr_##func(void)
+ static
NOINLINE
void __isr_##func(void)
#endif
#ifndef DECLARE_ISR_CONTEXT_SWITCH
#define DECLARE_ISR_CONTEXT_SWITCH(func) DECLARE_ISR(func)
#endif
#ifndef DECLARE_ISR_CONTEXT_SWITCH
#define DECLARE_ISR_CONTEXT_SWITCH(func) DECLARE_ISR(func)