테일 체이닝
Tail-Chaining
ARM Cortex-M 프로세서에서 익셉션 간의 전환 시간을 줄이는 최적화 기능
동작 원리

2개의 익셉션 (IRQ1, IRQ2)이 있고, 이 익셉션이 발생하면 실행되는 핸들러1, 핸들러2가 있다고 가정하자.
또한 익셉션 우선순위는 IRQ1 > IRQ2 즉, IRQ1 익셉션이 우선 순위가 더 높다.
유저 스레드에서 실행중일때 IRQ1이 발생하면, 유저 스레드에서의 상태 (레지스터 내용)들을 전부 스택에 저장한다.
이를, 스태킹(stacking)이라고 한다. 이후에 핸들러1이 실행될 것이다.
핸들러1이 실행되는 도중에, IRQ2가 발생한다.
하지만, 우선순위는 IRQ1이 우선순위가 더 높기 때문에 처리가 보류(pending)된다.
핸들러1이 끝나야 핸들러2가 실행될 수 있다.
핸들러1의 실행이 끝나면 언스태킹(unstacking)이 발생 후, 다시 스태킹을 한다음 핸들러2를 실행할것으로 예상하지만
그렇지 않다.
이미 스태킹이 되어있는 상태에서 핸들러2가 실행된다.
핸들러2가 끝나야 비로소 언스태킹을 한다.
즉, 스태킹과 언스태킹을 생략해서 익셉션의 처리 속도를 높히는게 핵심이다.
지연 도착 (Late Arriving)
테일 체이닝에 의해 예상보다 빠르게 핸들러가 실행되는 현상

익셉션들을 보면, IRQ1과 IRQ2가 있으며 우선순위는 IRQ1이 더 높다.
IRQ2가 먼저 발생을 했고, 핸들러2를 실행하기전에 기존에 실행하던 상태를 저장하기 위해서 스태킹 동작을 수행한다.
스태킹을 하는 도중에 IRQ1이 발생한다. (여기서의 스태킹을 편의상 핸들러1 스태킹이라고 하겠다.)
IRQ1은 IRQ2보다 나중에 발생한 익셉션이지만 우선 순위가 높기때문에, 먼저 핸들러1가 실행된다.
이미 스태킹을 하는 도중이었기 때문에, 핸들러1 스태킹을 생략하고 핸들러2 스태킹이 끝나자 마자 핸들러2가 실행된다.
즉, 예상보다 빠르게 핸들러2가 실행된다.
이를 지연 도착이라고 한다.
인터럽트 선점
익셉션 처리를 실행하는 중에 또 다른 익셉션이 발생할 수 있다.
이때 새로운 익셉션의 우선 순위가 현재 익셉션보다 높을 경우에 새 익셉션이 현재 익셉션 처리를 선점한다.
인터럽트 중첩
하나의 인터럽트 핸들러가 실행되는 도중에 다른 인터렙트가 발생되어 처리된다.

ISR1 실행도중에 우선순위가 더 높은 ISR2가 실행되고, ISR2가 끝난 후
ISR1이 마저 실행된다.
이 상황에서는 선점과 중첩이 동시에 발생했다.
아무튼,
익셉션이 2개 발생했을때, 상황에 따라 stacking unstacking이 생략되는 경우가 있다면
이게 테일 체이닝이다.
이상황 저상황 전부 외우려하지 말 것~