Actually, I always face Spurious Interrupts in all my
LPC2XXX(LPC2138,LPC2220,LPC2290) targets and it hangs. Not only in GDB
debug mode as you described, but also in ROM.
I solve it with attatched patch. It works in ROM, but not tested in GDB
debug mode.
_________________________________________________________________
享用世界上最大的电子邮件系统― MSN Hotmail。 http://www.hotmail.com
---
/cygdrive/w/share/anon_cvs/ecos/packages/hal/arm/arch/current/src/vectors.S 2006-02-10
00:47:39.000000000 +0800
+++
/cygdrive/c/development/ecos/packages/hal/arm/arch/current/src/vectors.S 2006-11-16
15:46:25.424420500 +0800
@@ -204,11 +204,19 @@
#endif
ldr pc,.undefined_instruction // 0x04
ldr pc,.software_interrupt // 0x08 start && software
int
ldr pc,.abort_prefetch // 0x0C
ldr pc,.abort_data // 0x10
+#ifdef CYGPKG_HAL_ARM_LPC2XXX
+ #ifdef CYGSEM_HAL_ROM_RESET_USES_JUMP
+ .word 0xB4405F62 // checksum of other
vectors
+ #else
+ .word 0xB8A06F58 // checksum of other
vectors
+ #endif
+#else
.word 0 // unused
+#endif
ldr pc,.IRQ // 0x18
ldr pc,.FIQ // 0x1C
// The layout of these pointers should match the vector table above since
// they are copied in pairs.
@@ -945,13 +953,18 @@
#endif
// The return value from the handler (in r0) will indicate whether
a
// DSR is to be posted. Pass this together with a pointer to the
// interrupt object we have just used to the interrupt tidy up
routine.
+#ifdef CYGIMP_HAL_COMMON_INTERRUPTS_IGNORE_SPURIOUS
+ // If configure to IGNORE spurious interrupt, we don't branch here.
+ // Let it handled by "interrupt_end()" as normal.
+#else
// don't run this for spurious interrupts!
cmp v1,#CYGNUM_HAL_INTERRUPT_NONE
beq 17f
+#endif // CYGIMP_HAL_COMMON_INTERRUPTS_IGNORE_SPURIOUS
ldr r1,.hal_interrupt_objects
ldr r1,[r1,v1,lsl #2]
mov r2,v6 // register frame
THUMB_MODE(r3,10)
--
Before posting, please read the FAQ: http://ecos.sourceware.org/fom/ecos
and search the list archive: http://ecos.sourceware.org/ml/ecos-discuss