
ARM7DI Data Sheet
20
3.4 Exceptions
Exceptions arise whenever there is a need for the normal flow of program execution to be broken, so that
(for example) the processor can be diverted to handle an interrupt from a peripheral. The processor state
just prior to handling the exception must be preserved so that the original program can be resumed when
the exception routine has completed. Many exceptions may arise at the same time.
ARM7DI handles exceptions by making use of the banked registers to save state. The old PC and CPSR
contents are copied into the appropriate R14 and SPSR and the PC and mode bits in the CPSR bits are forced
to a value which depends on the exception. Interrupt disable flags are set where required to prevent
otherwise unmanageable nestings of exceptions. In the case of a re-entrant interrupt handler, R14 and the
SPSR should be saved onto a stack in main memory before re-enabling the interrupt; when transferring the
SPSR register to and from a stack, it is important to transfer the whole 32 bit value, and not just the flag or
control fields. When multiple exceptions arise simultaneously, a fixed priority determines the order in
which they are handled. This is listed later in Section 3.4.7: Exception Priorities on page 23.
3.4.1 FIQ
The FIQ (Fast Interrupt reQuest) exception is externally generated by taking the nFIQ input LOW. This
input can except either synchronous or asynchronous transitions, depending on the state of the ISYNC
input signal. When ISYNC is LOW, nFIQ (and nIRQ) are considered asynchronous, and a cycle delay for
synchronisation is incurred before the interrupt can affect the processor flow. FIQ is designed to support a
data transfer or channel process, and has sufficient private registers to remove the need for register saving
in such applications (thus minimising the overhead of context switching). The FIQ exception may be
disabled by setting the F flag in the CPSR (but note that this is not possible from User mode). If the F flag is
clear, ARM7DI checks for a LOW level on the output of the FIQ synchroniser at the end of each instruction.
When a FIQ is detected, ARM7DI:
(1) Saves the address of the next instruction to be executed plus 4 in R14_fiq; saves CPSR in SPSR_fiq
(2) Forces M[4:0]=10001 (FIQ mode) and sets the F and I bits in the CPSR
(3) Forces the PC to fetch the next instruction from address 0x1C
To return normally from FIQ, use SUBS PC, R14_fiq,#4 which will restore both the PC (from R14) and the
CPSR (from SPSR_fiq) and resume execution of the interrupted code.
3.4.2 IRQ
The IRQ (Interrupt ReQuest) exception is a normal interrupt caused by a LOW level on the nIRQ input. It
has a lower priority than FIQ, and is masked out when a FIQ sequence is entered. Its effect may be masked
out at any time by setting the I bit in the CPSR (but note that this is not possible from User mode). If the I
flag is clear, ARM7DI checks for a LOW level on the output of the IRQ synchroniser at the end of each
instruction. Note that nIRQ may also have synchronous or asynchronous timing, depending on the state of
the ISYNC input. When an IRQ is detected, ARM7DI: