■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■
'ARM Processor' 카테고리의 다른 글
[ARM 프로세서_Day6]SWI 처리과정,Handler 분석 (0) | 2018.11.18 |
---|---|
[ARM 프로세서_Day5]ROR Immediate 상수 (0) | 2018.11.17 |
[ARM 프로세서_Day5]Memcpy_Single,Multiple (0) | 2018.11.17 |
[ARM 프로세서_Day4]Mini_project-두더지 게임 (0) | 2018.11.06 |
[ARM 프로세서_Day3]Linux+ARM(환경설정) (0) | 2018.11.06 |