·¢²©ÎÄ
Linux My world

http://blog.chinaunix.net/space.php?uid=21961753

ʰȡ¼¼ÊõµÄÎå²Ê±´¿Ç <EMBED style="LEFT: 0px; POSITION: absolute; TOP: 0px" align=center src="http://blogimg.chinaunix.net/blog/upfile2/100115191712.swf" width=870 height=220 type=application/x-shockwa   
¸öÈË×ÊÁÏ
  • ²©¿Í·ÃÎÊ£º109204
  • ²©ÎÄÊýÁ¿£º107
  • ²©¿Í»ý·Ö£º4010
  • ²©¿ÍµÈ¼¶£ºÉÏУ
  • ¹Ø×¢ÈËÆø£º 3
  • ×¢²áʱ¼ä£º2009-06-23 15:17:24
¶©ÔÄÎҵIJ©¿Í
  • ¶©ÔÄ
  • ¶©Ôĵ½Ïʹû
  • ¶©Ôĵ½×¥Ïº
  • ¶©Ôĵ½Google
×ÖÌå´óС£º´ó ÖРС²©ÎÄ
·ÖÀࣺ Linux


15:08 2009-9-22
½ñÌì·ÖÎöÁËÒ»°Ñ4020µÄIRQ½øÈëºÍÍ˳ö¹ý³Ì£¬·¢ÏÖ²»ÉÙ¶«¶«£¬°´ÕÕ³£Àí½øIRQµÄ¹ý³ÌÊÇÓ²¼þÍê³ÉµÄ£¬¶ø³öÖжϵĹý³ÌÔòÐèÒª¸ù¾Ý¾ßÌå¹ý³Ì½øÐмӼõ²½ÖèÁË¡£

Õý³£µÄÖжϽøÈë¹ý³ÌÊÇ£º
£¨1£©¿½±´CPSRµ½SPSR_<mode>
£¨2£©ÉèÖÃÕýÈ·µÄCPSR룬arm×Ô¶¯Ó²¼þÍê³ÉÏÂÃæÈýÏ×÷£ºÇл»µ½ARM״̬£¬Çл»µ½Ò쳣ģʽ£¬½ûÖ¹Öжϡ£
£¨3£©±£´æ·µ»ØµØÖ·ÔÚLR_<mode>
£¨4£©ÉèÖÃPCµ½Òì³£ÏòÁ¿µØÖ·

ÒÔÉÏÕâËĸö²Ù×÷ÊÇÓ²¼þÍê³ÉµÄ£¬ÁíÍâÎÒ·¢ÏÖµ±Ä£Ê½»»µ½IRQģʽÏ£¬´ËʱµÄ¶ÑÕ»Ö¸ÕëspÒѾ­ÔÚÖжÏÕ»Ö¸Õ루Ìáǰָ¶¨ºÃµÄ£©ÉϼÓ8ÁË£¬ÎªÉ¶ÄØ£¿£¿
¶øÎÒÃÇÔÚÕæÕý²Ù×÷Öл¹ÐèÒª½«ÆäËû¼Ä´æÆ÷ÈëÕ»£¬Õâ¸ö¹ý³ÌÊÇÎÒÃÇ×Ô¼ºÐ´µÄ¡£
£¨5£©½«r0-r12ѹջ
ÕâÑùʵÏÖµÄÊDz»ÄÜÖжÏǶÌ׵Ĺý³Ì£¬Èç¹ûÏëʵÏÖÖжÏǶÌ×£¬»¹ÐèÒª½«r14£¬spsr£¬Ò²Ñ¹Õ»¡£

³öÖжÏʱ£¬ÎÒÃÇ×Ô¼ºÐèÒª×öÒÔϲÙ×÷£º
£¨1£©r0-r12³öÕ»
£¨2£©´ÓSPSR_<mode>»Ö¸´CPSR
£¨3£©´ÓLR_<mode>»Ö¸´PCÖµSUBS pc, lr, #4

Ò»°ã£¨2£©£¨3£©¹ý³ÌÊÇÒ»ÏÂÍê³ÉµÄ£¬Óà LDMFD sp!,{pc} ^   ¼´¿ÉÍê³É£¬ÓÃËü´úÂëʵÏÖÊDZȽÏÂé·³µÄ¡£

Ô­À´ÔÚSEP4020µÄÖжϴ¦Àí´úÂëÈçÏ£¬¿ÉÒÔ¿´³öÊÇÏ൱Âé·³µÄ¡£
IRQ_DO     
 
 stmfd sp!, {r0,r1}          

 ldr r0, =IRQ_R1         
 str r1, [r0]
 
 ldmfd sp!, {r0}
 ldr r1, =IRQ_R0          
 str r0, [r1]                ;±£´æR0ºÍR1¼Ä´æÆ÷£¨ÒòΪÕâÁ½¸ö¼Ä´æÆ÷ÔÙºóÃæÒªÓõ½£©
 
 add r13, r13, #4  ;»Ö¸´ÖжÏÕ»Õë
 
 sub r14, r14, #4             ;ʹr14Ö¸ÏòÖжϷµ»ØµÄÏÂÌõÓï¾ä
 mov r0, r14                 ;LR_irq(R14)¼õ4²¢±£´æÔÚR0
 
 mrs r1, spsr
 orr r1, r1, #0x80           ;½«SPSR_irqµÄÖÐ¶ÏÆÁ±ÎλÖá®1¡¯£¨ÆÁ±ÎÖжϣ©£¬²¢±£´æÔÙR1 ÖÐ
 msr cpsr_cxsf, r1  ;½«Ä£Ê½Çл»µ½ÖжÏǰµÄģʽ£¬¼´Õâ¸öʱºò¾ÍÓֻص½ÁËSVCģʽÁË£¬µ«´ËʱÊDz»ÔÊÐíÖжϵġ£
;---------------ÏÖÔÚÓÖ½øÈëSVCģʽÁË------------------------------------------------------------------------------ 
 bic r1, r1, #0x80  ;½«Ô­Ïȱ£´æµÄSPSR_irqµÄR1µÄÖÐ¶ÏÆÁ±ÎλÇåÁ㣨ÔÊÐíÖжϣ©
 
 stmfd sp!, {r0}
 stmfd sp!, {r14}
 stmfd sp!, {r1}               ;ÒÀ´Î½«R0,R14,R1µÄֵѹÈëÖжÏǰģʽϵĶÑÕ»£¨µ±Ç°R0,R14,R1Öдæ·ÅµÄ·Ö±ðÊÇLR_irq-4£¬ÖжÏǰģʽϵÄLR£¬SPSR_irq)
 
 ldr r0, =IRQ_R1   
 ldr r1, [r0]
 stmfd sp!, {r1}
  
 ldr r1, =IRQ_R0   
 ldr r0, [r1]
 stmfd sp!, {r0}                
 
 ldmfd sp!, {r0,r1}            ;»Ö¸´Ô­Ïȱ£´æµÄR0ºÍR1
 stmfd sp!, {r0-r12}  ;½«r0--r12È«²¿Ñ¹ÈëÖжÏÒÔǰģʽ¼´SVCģʽϵĶÑÕ»

;-----------------------------     
 IMPORT int_vector_handler
 bl int_vector_handler      ;Ìø×ªµ½ÖжÏÔ´ÅжϺÍÖжϴ¦Àí³ÌÐò

;-----------------ÖжϷµ»Ø------------          ;restore the register
 ldmfd sp!, {r0-r12}           ;»Ö¸´Ô­Ïȱ£´æµÄR0-R12
 ldmfd sp!, {r14}
 msr cpsr_cxsf, r14          ;»Ö¸´SVCϵÄcpsr£¬²¢ÇÒÔÊÐíÖжÏ
 ldmfd sp!, {r14}              ;½«Ô­Ïȱ£´æµÄSPSR_irq»Ö¸´µ½CPSRÖÐ
 ldmfd sp!, {pc}


ÎÒºóÀ´×Ô¼º¸ÄµÄÒ»¸öÁ÷³Ì£¬Õâ¸öÊÇÖжÏÔÊÐíǶÌ×µÄ×ö·¨
 IRQ_DO     
 
 stmfd sp!, {r0,r1}          

 ldr r0, =IRQ_R1      ;¼ÓÔØ    ³£ÊýIRQ_R1µÄµØÖ·µ½r0
 str r1, [r0]
 
 ldmfd sp!, {r0}
 ldr r1, =IRQ_R0          
 str r0, [r1]                ;±£´æR0ºÍR1¼Ä´æÆ÷£¨ÒòΪÕâÁ½¸ö¼Ä´æÆ÷ÔÙºóÃæÒªÓõ½£©
 
 ;add r13, r13, #4  ;restore the sp_irq top to original irq top
 
 sub r14, r14, #4
 mov r0, r14                 ;LR_irq(R14)¼õ4²¢±£´æÔÚR0
 
 mrs r1, spsr               ;±£´æSVCģʽϵÄcpsrµ½r1ÖУ¬×¼±¸Ñ¹Õ»±£´æ£¬ÒԱ㷵»ØÊ±ÓÃ
  
 stmfd sp!, {r0}       ;lr-4
 stmfd sp!, {r14}      ;r14
 stmfd sp!, {r1}          ;spsr_irq   

 ldr r0, =IRQ_R1   
 ldr r1, [r0]
 stmfd sp!, {r1}
  
 ldr r1, =IRQ_R0   
 ldr r0, [r1]
 stmfd sp!, {r0}                
 
 ldmfd sp!, {r0,r1}            ;»Ö¸´Ô­Ïȱ£´æµÄR0ºÍR1
 stmfd sp!, {r0-r12}  ;½«r0--r12È«²¿Ñ¹ÈëÖжÏÒÔǰģʽϵĶÑÕ»

 ;mrs r5,cpsr
 ;bic r5,r5,#0x80
 ;msr cpsr_cxsf,r5         ;ʹÖжÏÄܹ»Ç¶Ì×,µ«²»ÄÜÔÚ´ËÓã¬ÒòΪÖжÏÔ´»¹Ã»±ðÇ壬ÕâÊÇ¿ªÖжÏÓÖ»á½øÈëÖжÏÁË
;-----------------------------     
 IMPORT int_vector_handler
 bl int_vector_handler      ;Ìø×ªµ½ÖжÏÔ´ÅжϺÍÖжϴ¦Àí³ÌÐò

;-----------------------------          ;restore the register
 ldmfd sp!, {r0-r12}           ;»Ö¸´Ô­Ïȱ£´æµÄR0-R12
 ldmfd sp!, {r14}
 msr spsr_cxsf, r14
 ldmfd sp!, {r14}              ;½«Ô­Ïȱ£´æµÄSPSR_irq»Ö¸´µ½CPSRÖÐ
 ldmfd sp!, {pc}^
                                      
 EXPORT ENABLE_IRQ
;----------ÏÂÃæÊǺ¯ÊýÕ»£¬¿ÉÒÔ¶Ô±ÈÏÂÖжÏÕ»ÓÚº¯ÊýÕ»µÄÇø±ð-----------------------------
ENABLE_IRQ
 stmfd sp!,{r5,r14}         ;º¯Êý½øÈëʱ£¬º¯Êýѹջ
     mrs r5,cpsr
 bic r5,r5,#0x80
 msr cpsr_cxsf,r5        ;ʹÖжÏÄܹ»Ç¶Ì×,
 ldmfd sp!,{r5,pc}       ;º¯Êý·µ»Ø
;¿ÉÒÔ·¢ÏÖÖжÏÕ»Ó뺯ÊýÕ»µÄÇø±ðÔÚÓÚ£¬ÖжÏÕ»Òª±£´æcpsr£¬¶øº¯ÊýÕ»²»ÓùÜcpsrÁË£¬Òò´Ë·µ»ØÊ±Ò²²»ÓÃÇл»Ä£Ê½ÁË¡£

ÔÚÖжϺ¯ÊýÖн«irq´ò¿ª¼´¿ÉÔÙ´ÎÒýÆðÖжϣ¬ÓÃENABLE_IRQ¼´¿É£¬¶øÓÉÓÚÕâʱºòÉϴεÄÖжÏÏÖ³¡¶¼ÒѾ­±£´æËùÒÔÔٴνøÖжÏÊÇ¿ÉÒԵ쬵«Ç°ÌáÊÇÉÏ´ÎÖжÏÒѾ­Çå³ýÁË¡£

Ç×£¬Äú»¹Ã»ÓеǼ,Çë[µÇ¼]»ò[×¢²á]ºóÔÙ½øÐÐÆÀÂÛ