Çë½Ìuclinux+armµÄIRQÖжϴ¦Àí¹ý³ÌÖеÄÎÊÌâ
¸÷λ¸ßÊÖ:´ó¼ÒºÃ!ÎÒÊÇÒ»ÃûѧϰlinuxµÄÐÂÊÖ.ËùÒÔ»¹ÓкܶàÎÊÌâÒªÇë½Ì´ó¼Ò!¼±Åδó¼Ò°ïæ!!!
×î½ü,ÎÒÔÚѧϰuclinux+armµÄIRQÖжϴ¦Àí¹ý³ÌµÄÔ´´úÂëÖÐ,Óöµ½Õâôһ¸öÎÊÌâ,°Ù˼²»µÃÆä½â.
µ±IRQÖжϷ¢Éúºó,cpuÒ»¶¨»áÌøµ½/linux/arch/arm/kernel/entry-armv.SÖеÄvector_IRQ´¦Ö´ÐÐ.
vector_IRQ: @
@ save mode specific registers
@
ldr r13, .LCsirq
sub lr, lr, #4
str lr, [r13] @ save lr_IRQ
mrs lr, spsr
str lr, [r13, #4] @ save spsr_IRQ
@
@ now branch to the relevent MODE handling routine
@
mov r13, #I_BIT | MODE_SVC
msr spsr_c, r13 @ switch to SVC_32 mode
and lr, lr, #15
ldr lr, [pc, lr, lsl #2]
movs pc, lr @ Changes mode and branches
.LCtab_irq: .word __irq_usr @ 0 (USR_26 / USR_32)
.word __irq_invalid @ 1 (FIQ_26 / FIQ_32)
.word __irq_invalid @ 2 (IRQ_26 / IRQ_32)
.word __irq_svc @ 3 (SVC_26 / SVC_32)
.word __irq_invalid @ 4
.word __irq_invalid @ 5
.word __irq_invalid @ 6
.word __irq_invalid @ 7
.word __irq_invalid @ 8
.word __irq_invalid @ 9
.word __irq_invalid @ a
.word __irq_invalid @ b
.word __irq_invalid @ c
.word __irq_invalid @ d
.word __irq_invalid @ e
.word __irq_invalid @ f
.align 5
ÔÚÕâÀï,cpu½«¸ù¾ÝÖжϷ¢ÉúǰÆäËù´¦µÄÔËÐÐģʽÀ´Ñ¡ÔñÄĸö×Ó³ÌÐòÖ´ÐÐ.ÎÒÃǼÙÉèÔÀ´ÔÚÓû§Ä£Ê½(usr),Ôòcpu½«Ìø×ªµ½__irq_usr³öÖ´ÐÐ.
__irq_usr: sub sp, sp, #S_FRAME_SIZE
stmia sp, {r0 - r12} @ save r0 - r12
ldr r4, .LCirq
add r8, sp, #S_PC
ldmia r4, {r5 - r7} @ get saved PC, SPSR
stmia r8, {r5 - r7} @ save pc, psr, old_r0
stmdb r8, {sp, lr}^
alignment_trap r4, r7, __temp_irq
zero_fp
1: get_irqnr_and_base r0, r6, r5, lr @»ñµÃÓÅÏȼ¶×î¸ßµÄÖжϺŵ½r0
movne r1, sp @½«µ±Ç°¶ÑÕ»Ö¸Õ븳¸ør1
adrsvc ne, lr, 1b @ͨ¹ýÉèÖÃlr£¬Ê¹ÊµÏÖÁ˶ÔÖжϵĴ®Ðд¦Àí
@
@ routine called with r0 = irq number, r1 = struct pt_regs *
@
bne do_IRQ
mov why, #0
get_current_task tsk
b ret_to_user
ÎÊÌâ³öÔÚÕâÀï:ÔÚvector_IRQ×îºó½«mov r13, #I_BIT | MODE_SVC,¼´r13=#I_BIT | MODE_SVC(³£Êý).¶ø½ô½Ó×ÅÔÚ__irq_usrÖÐÂíÉÏÓÖsub sp, sp, #S_FRAME_SIZE,¼´r13=r13 - #S_FRAME_SIZE.
ÕâÑù²»Êǽ«¶ÑÕ»Ö¸Õë»ìÂÒÁËÂð?µ±Ç¶Ì×ÖжϷ¢Éúʱ,±Ø½«Òò¶ÑÕ»Ö¸ÕëÊdz£Êý¶ø»ìÂÒ.³ý·Ç,spºÍr13²»ÊÇָͬһ¸ö¼Ä´æÆ÷,µ«ÊÇÓÖûÓнøÐÐģʽת»»Ñ½.Õâµ½µ×ÊÇÔõô»ØÊÂ?Çë´ó¼ÒÖ¸½Ì!!!!!!!!!!Íò·Ö¸Ðл!!!!!!¼±ÅÎ! ÔõôûÈ˰ïÎÒ¿´Ò»ÏÂ
Ò³:
[1]