CS452 - Real-Time Programming - Winter 2013
Lecture 11 - Hardware Interrupts
Pubilc Service Annoucements
- Due date for assignment 3
Hardware Interrupts
What is a Hardware Interrupt?
In the CPU
- Test interrupt signal before fetching the next instruction
- actually AND of INT and the IRQ bit in the CPSR
- If asserted, follow interrupt procedure
LR_irq = address of next instruction to be executed + 4
SPSR_irq = CPSR
CPSR[4:0] = 0b10010 ; IRQ mode
CPSR[5] = 0 ; ARM instructions
CPSR[7] = 1 ; disable interrupts
PC = 0x018
- Execute instruction at 0x18, which results in a jump to a kernel entry
sooner or later.
In the Interrupt Control Unit (ICU)
- Several interrupts may be present when an interrupt occurs
- One is chosen, by a priority mechanism
- A software priority mechanism is easiest to implement
- Read register in ICU
- Determine which interrupt is most important to you
- Leave the other(s) until later
- Hardware is faster, but is error prone and only a little faster
In the Peripheral Hardware
- Several interrupts may be present
- ORed in peripheral hardware
- ORed in glue hardware
- Software determines priority
- Read register in peripheral
- Determine which interrupt is most important
- Leave the other(s) to later
- Clearing one interrupt can expose another one
When two interrupts are present
Clearing one interrupt can mean you take another immediately
- Kernel executes with interrupts disabled
- Context switch into user task turns on interrupts
- Before fetching the first user task instruction test interrupt
signal
- If asserted, re-initiate interrupt processing
Context Switches for Interrupts
Difference from Software Interrupts
It is impossible to predict where they occur
- You may have made some assumptions about when they occur
Assymmetry between User Task and Kernel
Scratch Registers must be saved
Two Link Registers
- One to return from interrupt
- In the registers of the interrupt handling code
- To return to the interrupted task in the right place
- One to unwind the caller's stack frame
- In the registers of the interrupted task
- To return to whatever started in interrupted task
The SWI link register is off by 4 compared to the IRQ link register.
Everything above is extra compared to the software context switch.
One entry point or two
It's up to you, but it's probably a good idea to have a single exit, which
is easier if there's one entry.
Helpful Features of the ICU
- Several places where you can read state
- Several places where you can block interrupt flow
- Trigger hardware interrupt from software
- What makes interrupts hard is that you are doing two semi-hard
things at once
- Making the hardware produce the interrupt
- Responding to the interrupt
- This allows you to separate them in developing/debugging
The Hardware in the Trains Lab
32-bit Timer
Base address: 0x80810080
Three registers:
| Offset |
Function |
R/W |
Bits |
Comments |
| 0x0 |
Timer3Load |
R/W |
32: <Load/Reload Value> |
|
| 0x4 |
Timer3Value |
R |
32:<Current value> |
Set when Load is written,
even when counting |
| 0x8 |
Timer3Control |
R/W |
3:xxx<CLKSEL>xx<MODE><ENABLE> |
<CLKSEL>: 0, 2KHz clock; 1, 508KHz
<MODE>: 1, count continuously; 0, count once
<ENABLE>: Clock turned on
|
| 0xc |
Timer3Clear |
W |
32: |
Writing anything clears the interrupt |
Interrupt Control Unit (ICU)
The actual device is the ARM PL190, Vectored Interrupt Controller (VIC),
Interrupt Control Unit (ICU)
The logic in this design is completely asynchronous, so it functions when
the CPU clock is turned off.
- Important (= essential) for low power operation.
All input signals are
- active high
- level sensitive
Base addresses
- VIC1:
0x800B0000
- VIC2:
0x800C0000
Basic Operation
VIC powers up with
- all vectored interrupts disabled.
- all interrupts masked
- all interrupts activating IRQ
It's a bad idea to assume that it's in this state when your kernel starts
running.
Procedure
Initialization
- leave protection off
- enable in VICxIntEnable when you are ready to handle the interrupt
On an interrupt
- Read VICxIRQStatus
- Choose which interrupt you wish to handle
- Clear the interrupt source in the device
For debugging
- Use VICxSoftInt and VICxSoftIntClear to turn interrupt sources off and
on in software
Hardware Definitions
Registers for Basic Operation
| Register Name |
Offset |
R/W |
Description |
| VICxIRQStatus |
0x00 |
RO |
One bit for each interrupt source
1 if interrupt is asserted and enabled
|
| VICxFIQStatus |
0x04 |
RO |
As above for FIQ |
| VICxRawIntr |
0x08 |
RO |
As above but not masked |
| VICxIntSelect |
0x0c |
R/W |
0: IRQ, 1: FIQ |
| VICxIntEnable |
0x10 |
R/W |
0: Masked, 1: Enabled |
| VICxIntEnClear |
0x14 |
WO |
Clears bits in VICxIntEnable |
| VICxSoftInt |
0x18 |
R/W |
Asserts interrupt from software |
| VICxSoftIntClear |
0x1c |
WO |
Clears interrupt from software |
| VICxProtection |
0x20 |
R/W |
Bit 0 enables protection from user mode access |
| VICxVectAddr |
0x30 |
R/W |
Enables priority hardware
See documentation.
|
Helpful Features of the ICU
- Several places where you can read state
- Several places where you can block interrupt flow
- Trigger hardware interrupt from softwareonce
- What makes interrupts hard is that you are doing two semi-hard
things at once
- Making the hardware produce the interrupt
- Responding to the interrupt
- Software interrupt generation allows you to separate them in
developing/debugging
Non-vectored Operation
Initialization
- Enable interrupt in device
- Enable interrupt in ICU
- Enable interrupt in CPU, usually by MOVS or SUBS
Interrupt occurs
- AND of IRQ and NOT( IRQ disabled bit in CPSR ) is checked before each
instruction fetch.
- If set IRQ exception is taken in place of next instruction fetch.
- Possibly zero instructions of active task are executed.
- Make sure that this case works
- Context switch into kernel
Context switch novelties
Difference from Software Interrupts
- It is impossible to predict where they occur
- You may inadvertently have made some assumptions about when they
occur
- Scratch Registers must be saved
- r0-3
- IP -- used only very occasionally by gcc
- Two Link Registers
- One to return from interrupt
- One to return from the interrupted task to whatever called
it
- Trashing the second link register in the kernel is a bug that
doesn't occur with a software interrupt.
- Turn off interrupt in device
- Should turn off interrupt in ICU
- What about IRQ?
You are now ready to process the interrupt in the kernel
Return to: