인터럽트와 우선순위 시뮬레이션
main 루프를 돌던 CPU가 인터럽트를 만나면 어디로 뛰고 언제 돌아오는지 봅니다. 우선순위와 선점, 긴 핸들러, 임계 구역, 플래그를 지우지 않았을 때의 무한 재진입까지 직접 만들어 봅니다.
CPUmain스택 깊이 0
CPU가 지금 있는 곳대기 중인 요청실제로는 수 ms 안에 끝나는 일을 느리게 보여 줍니다
3D 장면을 불러오는 중입니다
조작
실행 기록 최근 40 ms
채워진 구간이 CPU가 그 코드를 실행한 시간입니다. 빨간 세로선은 요청이 들어온 순간입니다.
측정
- 버튼 응답 지연
- -
- UART 응답 지연
- -
- main 한 바퀴
- -
- 스택 사용
- 0 바이트
이렇게 해 보세요
- 노란 구슬이 CPU입니다. 평소에는 아래쪽 고리(main 루프)를 돕니다. UART 인터럽트를 누르면 구슬이 가운데 층으로 뛰어올라 핸들러를 끝까지 달린 뒤, 떠났던 자리로 정확히 돌아옵니다.
- UART 핸들러가 도는 동안 버튼 인터럽트를 누르세요. 우선순위가 더 높아서 UART 핸들러를 끊고 맨 위층으로 올라갑니다. 오른쪽 스택 탑에 상자가 하나 더 쌓입니다. 이것이 선점입니다.
- 우선순위를 같음으로 바꾸고 다시 해 보세요. 이번에는 끊지 못하고 UART 핸들러가 끝날 때까지 기다립니다. 아래 "버튼 응답 지연"이 그만큼 늘어납니다.
- UART ISR 길이를 길게 늘리고 UART 수신을 1.5 ms마다로 두면 main 루프가 거의 돌지 못합니다. 고리 위의 LED가 깜박이는 속도가 느려지는 것으로 보입니다. 핸들러를 짧게 쓰라는 이유입니다.
- 임계 구역을 5 ms로 두면 main이 인터럽트를 꺼 둔 동안 요청이 대기(빨간 점)만 하다가, 구간이 끝나는 순간 한꺼번에 처리됩니다.
- 플래그 지우기를 "잊음"으로 바꾸면 UART 핸들러가 끝나자마자 다시 불립니다. main 루프는 영원히 멈춥니다.
읽는 법
인터럽트가 걸리면 CPU는 하던 명령을 끝내고, 레지스터 여덟 개를 스택에 저장한 뒤 핸들러로 뜁니다. 핸들러가 끝나면 저장한 값을 꺼내 원래 자리로 돌아갑니다. 스택 탑의 상자 하나가 그 저장분(32바이트)입니다.
우선순위가 더 높은 인터럽트만 실행 중인 핸들러를 끊을 수 있습니다. 같거나 낮으면 대기합니다. Cortex-M에서는 숫자가 작을수록 우선순위가 높습니다.
이 실험실은 진입에 걸리는 12사이클 같은 세부는 생략하고, 순서와 지연이 어디서 생기는지에 집중했습니다. 표시되는 시간은 예시 값입니다.
자세한 설명은 인터럽트와 예외 노트와 인터럽트와 NVIC 노트에 있습니다.