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"
Absoultey thanks to you Niall.
This is exactly what I am looking for
I guess I can manage Stack alignment using below instructions
and r4, sp, #4
sub sp, sp, r4
Only one doubt I do want to get cleared
SRSFD #0x12!
Is this Instruction is really required?
Since we are not expecting any other interrupts here and it just a simple IRQ handler(not the nested one)
So,why we do require to save the SPSR here.
Also,I don't know how SRSED works, I mean how it pushes the SRSR and LR to IRQ mode stack
Is #012 is base address of IRQ mode stack?
Yes, Tomar, you could use those instructions to manage the stack alignment. You would need to remember to "undo" any change you have made to the stack pointer before returning from the handler, though. You can do this by simply adding back the value in r4.
In the SRSFD instruction, 0x12 is the mode number of the IRQ mode (i.e. the value in the mode field of CPSR which specifies IRQ mode) so this is what specifies use of the IRQ stack. You are right that there is no real need to save SPSR if you are not expecting any further interrupts. So you could just push LR at this point. I think we would say, though, that SRS/RFE is a more modern pair of instructions these days!
Thanks Chris, your comments are indeed quite useful !!!