ARM 디벨로퍼 책을 보다 잘 이해가 안되서 검색해보니 레시피에 잘 나와있다.
먼저 인터럽트가 발생하는 시점에 대해서 알아야 한다.
답은 인터럽트 마다 다르다.
- Reset 헨들러
: 시스템이 동작하게 되면 자동으로 오는 익셉션이 Reset이다.
즉 돌아갈 곳이 없기때문에 상관하지 않아도 된다.
- Undefined instruction 헨들러 lr = pc
: 인스트럭션이 정의되지 않은것인지 아닌지 언제 알 수 있을까?
명령어를 해서하는 decode 단계일 것이다. 그렇다면 파이프라인에 의해 fetch단계로
다음 인스트럭션이 들어온 상태일 것이다.
pc는 현재 fetch단계에 있는 인스트럭션의 주소를 가르킨다. lr에는 현재의 pc값이 들어간다.
return :
pc = lr
- Prefetch abort 헨들러 lr = pc + 1
: Prefetch Abort는 존재하지 않는 메모리에서 fetch를 시도할 때 발생한다.
즉 Abort발생위치가 pc가 된다. 레시피에서는 돌아올때의 편의성을 위해
1사이클을 더한다고 하는데 왜 이렇게 하는게 편한지는 잘 모르겠다.
Prefetch abort는 두가지 방식으로 알아서 처리하면 된다.
return :
pc = lr //다음 인스트럭션 수행
pc = lr-1 //Abort가 발생했던 인스트럭션을 다시 수행하고 싶다면...
- Data abort 헨들러 lr = pc + 2
: 3단계 파이프라인의 경우 Execute 단계에서 memory접근도 이루어지므로
pc값은 + 2cycle이 되어있다.
return
pc = lr - 2 //다시 인스트럭션을 수행하려 한다면...
pc = lr - 1 //다음 인스트럭션 수행
- SWI 헨들러 lr = pc + 1
: Decode를 수행하여야 이것이 SWI인지 알 수 있을것이다.
return
lr = pc
- IRQ/FIQ 헨들러 lr = pc + 2
IRQ와 FIQ는 발생시점이 정해져있지 않다. 3단계 파이프라인에서
Execute가 수행되지 않은 나머지 2개의 인스트럭션을 다시 수행해줘야 한다.
즉 pc값은 항상 2사이클 앞을 가르키고 있다.
return
pc = lr - 1
레시피에서는 ARM/Thumb 모드로 구분해서 설명하는것 같다.
(+4를 사용하지 않고 +1cycle이라고 쓴걸로 봐서)
근데 Thumb모드에서 익셉션 발생시 ARM모드로 전환되는 것으로 알고 있는데...
끝.



덧글