그라운드 임베디드 EN 유튜브 구독

실험실

인터럽트와 우선순위 시뮬레이션

main 루프를 돌던 CPU가 인터럽트를 만나면 어디로 뛰고 언제 돌아오는지 봅니다. 우선순위와 선점, 긴 핸들러, 임계 구역, 플래그를 지우지 않았을 때의 무한 재진입까지 직접 만들어 봅니다.

조작

실행 기록 최근 40 ms

채워진 구간이 CPU가 그 코드를 실행한 시간입니다. 빨간 세로선은 요청이 들어온 순간입니다.

측정

버튼 응답 지연
-
UART 응답 지연
-
main 한 바퀴
-
스택 사용
0 바이트

이렇게 해 보세요

  1. 노란 구슬이 CPU입니다. 평소에는 아래쪽 고리(main 루프)를 돕니다. UART 인터럽트를 누르면 구슬이 가운데 층으로 뛰어올라 핸들러를 끝까지 달린 뒤, 떠났던 자리로 정확히 돌아옵니다.
  2. UART 핸들러가 도는 동안 버튼 인터럽트를 누르세요. 우선순위가 더 높아서 UART 핸들러를 끊고 맨 위층으로 올라갑니다. 오른쪽 스택 탑에 상자가 하나 더 쌓입니다. 이것이 선점입니다.
  3. 우선순위를 같음으로 바꾸고 다시 해 보세요. 이번에는 끊지 못하고 UART 핸들러가 끝날 때까지 기다립니다. 아래 "버튼 응답 지연"이 그만큼 늘어납니다.
  4. UART ISR 길이를 길게 늘리고 UART 수신을 1.5 ms마다로 두면 main 루프가 거의 돌지 못합니다. 고리 위의 LED가 깜박이는 속도가 느려지는 것으로 보입니다. 핸들러를 짧게 쓰라는 이유입니다.
  5. 임계 구역을 5 ms로 두면 main이 인터럽트를 꺼 둔 동안 요청이 대기(빨간 점)만 하다가, 구간이 끝나는 순간 한꺼번에 처리됩니다.
  6. 플래그 지우기를 "잊음"으로 바꾸면 UART 핸들러가 끝나자마자 다시 불립니다. main 루프는 영원히 멈춥니다.

읽는 법

인터럽트가 걸리면 CPU는 하던 명령을 끝내고, 레지스터 여덟 개를 스택에 저장한 뒤 핸들러로 뜁니다. 핸들러가 끝나면 저장한 값을 꺼내 원래 자리로 돌아갑니다. 스택 탑의 상자 하나가 그 저장분(32바이트)입니다.

우선순위가 더 높은 인터럽트만 실행 중인 핸들러를 끊을 수 있습니다. 같거나 낮으면 대기합니다. Cortex-M에서는 숫자가 작을수록 우선순위가 높습니다.

이 실험실은 진입에 걸리는 12사이클 같은 세부는 생략하고, 순서와 지연이 어디서 생기는지에 집중했습니다. 표시되는 시간은 예시 값입니다.

자세한 설명은 인터럽트와 예외 노트와 인터럽트와 NVIC 노트에 있습니다.

PROJECT COURSE인터럽트를 실제 펌웨어에서 써 보고 싶다면밸런싱 로봇 하나를 요구사항, 회로와 PCB, 펌웨어, 앱까지 실무 순서대로 만드는 강의입니다. 10파트 165강.강의 살펴보기 →FREE PDF무료 전자책 3권 받기돌려 본 원리를 글로 정리해 두고 싶다면. BLDC 모터 제어, 직렬통신, 센서를 책 분량으로 묶었습니다. 이메일만 남기면 바로 받습니다.무료로 받기 →