■IRQ 분석


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
    .equ _ISR_STARTADDRESS,        0x33ffff00
 
_start:
 
    /* ResetHandler가 처음부터 나오는 것이 아니라 
     * vector 주소 영역에는 reset vector가 존재해야 한다
     * exception이 발생하면 ARM은 하드웨어적으로 다음 주소로 분기된다
     */
    b    ResetHandler
    b    HandlerUndef            /* handler for Undefined mode */
    b    HandlerSWI            /* handler for SWI interrupt */
    b    HandlerPabort            /* handler for PAbort */
    b    HandlerDabort            /* handler for DAbort */
    b    .                        /* reserved */
    b    HandlerIRQ                /* handler for IRQ interrupt */
    b    HandlerFIQ                /* handler for FIQ interrupt */
 
    .ltorg
HANDLER HandlerFIQ, HandleFIQ
HANDLER HandlerIRQ, HandleIRQ
HANDLER HandlerUndef, HandleUndef
HANDLER HandlerSWI, HandleSWI
HANDLER HandlerDabort, HandleDabort
HANDLER HandlerPabort, HandlePabort
 
 
    /* 여기서 IRQ가 발생할때 위에서 만든 
     * IsrIRQ 루틴으로 분기하기 위한 ISR_VECTOR 설정을 한다 
     */
    /* Setup IRQ handler */
    ldr    r0,=HandleIRQ  
    ldr    r1,=IsrIRQ            
    str    r1,[r0]
 
 
// check  INTOFFSET1
 chk_off1:
        ldr     r9,=INTOFFSET1
        ldr     r9,[r9]
        cmp r9,#0
      beq   chk_off2
        ldr     r8,=HandleEINT0
        add     r8,r8,r9,lsl #2
        b end_off
 
 // check  INTOFFSET2
 chk_off2:
        ldr     r9,=INTOFFSET2
        ldr     r9,[r9]
        cmp r9,#0
      beq   abt_return
        ldr     r8,=Handle2D
        add     r8,r8,r9,lsl #2
 
end_off: // generic interrupt
        ldr     r8,[r8]
        str     r8,[sp,#8]
        ldmfd   sp!,{r8-r9,pc} 
 
abt_return: // no interrupt
     sub lr,lr,#4
        str   lr,[sp,#8]
        ldmfd   sp!,{r8-r9,pc}^
 
    /* function initializing stacks */
cs



■그림으로 보는 IRQ


+ Recent posts