Philips LPC2194 User Manual page 107

Table of Contents

Advertisement

Philips Semiconductors
ARM-based Microcontroller
This means that, on entry to the IRQ interrupt service routine, one can see the unusual effect that an IRQ interrupt has just been
taken while the I bit in the SPSR is set. In the example above, the F bit will also be set in both the CPSR and SPSR. This means
that FIQs are disabled upon entry to the IRQ service routine, and will remain so until explicitly re-enabled. FIQs will not be re-
enabled automatically by the IRQ return sequence.
Although the example shows both IRQ and FIQ interrupts being disabled, similar behavior occurs when only one of the two
interrupt types is being disabled. The fact that the core processes the IRQ after completion of the MSR instruction which disables
IRQs does not normally cause a problem, since an interrupt arriving just one cycle earlier would be expected to be taken. When
the interrupt routine returns with an instruction like:
SUBS
pc, lr, #4
the SPSR_IRQ is restored to the CPSR. The CPSR will now have the I bit and F bit set, and therefore execution will continue
with all interrupts disabled.
However, this can cause problems in the following cases:
Problem 1: A particular routine maybe called as an IRQ handler, or as a regular subroutine. In the latter case, the system
guarantees that IRQs would have been disabled prior to the routine being called. The routine exploits this restriction to determine
how it was called (by examining the I bit of the SPSR), and returns using the appropriate instruction. If the routine is entered due
to an IRQ being received during execution of the MSR instruction which disables IRQs, then the I bit in the SPSR will be set. The
routine would therefore assume that it could not have been entered via an IRQ.
Problem 2: FIQs and IRQs are both disabled by the same write to the CPSR. In this case, if an IRQ is received during the CPSR
write, FIQs will be disabled for the execution time of the IRQ handler. This may not be acceptable in a system where FIQs must
not be disabled for more than a few cycles.
Workaround:
There are 3 suggested workarounds. Which of these is most applicable will depend upon the requirements of the particular
system.
Solution 1: Add code similar to the following at the start of the interrupt routine.
SUB
lr, lr, #4
STMFD
sp!, {..., lr}
MRS
lr, SPSR
TST
lr, #I_Bit
LDMNEFD sp!, {..., pc}^
This code will test for the situation where the IRQ was received during a write to disable IRQs. If this is the case, the code returns
immediately - resulting in the IRQ not being acknowledged (cleared), and further IRQs being disabled.
Similar code may also be applied to the FIQ handler, in order to resolve the first issue.
This is the recommended workaround, as it overcomes both problems mentioned above. However, in the case of problem two,
it does add several cycles to the maximum length of time FIQs will be disabled.
Vectored Interrupt Controller (VIC)
; Adjust LR to point to return
; Get some free regs
; See if we got an interrupt while
; interrupts were disabled.
; If so, just return immediately.
; The interrupt will remain
; acknowledged it and will be reissued when interrupts are
; next enabled.
; Rest of interrupt routine
107
Preliminary User Manual
LPC2119/2129/2194/2292/2294
pending since we haven't
May 03, 2004

Advertisement

Table of Contents
loading

This manual is also suitable for:

Lpc2129Lpc2119Lpc2292Lpc2294

Table of Contents