Hi everyone
I am new to ARM and really wanted to learn about various aspects of ARM Programming .
I have basic understanding of x86 Assembly.
So,what Specifically I wanted to know is what happens when an external device triggers an interrupt .
Let me put my basic understanding on the same, which I learnt in last few days
Offset Handler =============== 00 Reset 04 Undefined Instruction 08 Supervisor Call (SVC) 0C Prefetch Abort 10 Data Abort 14 (Reserved) 18 Interrupt (IRQ) 1C Fast Interrupt (FIQ)
Whenever Interrupt comes instruction at address 18 is executed
So is it true that it is first instruction executed when interrupts comes??
Or as I read somewhere whenever interrupts comes first it moves from user mode to IRQ mode and cpsr is copied to spsr_IRQ but it happen without an instruction .
After that current instruction is replaced with a blx 0x18
blx 0x18
How and where we do need to set the stack for different mode e.g for IRQ mode and Supervisior mode??
In the brancged code
IRQ_HANDLER:
SUB lr, lr, #4
STMFD !sp {r14}
bl IRQ_handler_to_specific_device ;it will branch to actuall hander code.
LDMFD r13!,{r14} mov pc, r14
LDMFD r13!,{r14}
mov pc, r14
Is it all We need to do for setting up Basic IRQ handling ?
Also,how PIC/CPU comes to know that interrupt is coming from which device?
Thanks
Amit Singh Tomar.
"ARM is taking over the world"
Thanks Niall for your reply
But I really can't think why r0-r3 and r12 need to be pushed and where/when it need to pushed.
Also,would you please provde any link where a simple IRQ handler is written in assembly.
I really not sure what exact has to be there to handle a irq interrupt
Hi Tomar,
You've had some great replies so far. Hope they've been useful.
You need to push r0-r3,r12 because the AAPCS (Procedure Call Standard for the ARM Architecture) says that a called function may corrupt these registers. Since an interrupt handler is not allowed to corrupt any registers, if you call another function in your handler, you need to preserve these registers before doing so.
For details of how to write an interrupt handler in assembler, have a look at this section of the compiler documentation ARM Information Center
Hope this helps
Chris
Absolute minimum handler:
IRQ_handler
SUB lr, lr, #4 ; modify LR
SRSFD #0x12! ; store SPSR and LR to IRQ mode stack
PUSH {r0-r3, r12} ; store AAPCS registers on to the IRQ mode stack
BL IRQ_handler_to_specific_device
POP {r0-r3, r12} ; restore registers
RFEFD sp! ; and return from the exception using pre-modified LR
* Note this does not handle stack alignment