[ARM] 익셉션? 너는 누구니?

2026. 3. 17. 15:55·Embedded Systems/Arm 아키텍처

FreeRTOS의 Context Switching 기작을 파고들다보니, SysTick과 PendSV 인터럽트를 만났다. 이 때 PendSV가 Context Switching을 위한 익셉션이라는 설명이 있는데... 익셉션 개념이 기억이 나질 않아 정리해본다.


그래, 익셉션은 CPU 내부의 예외처리 알림이었지

구글링을 통해 만난 https://wikidocs.net/253592 에 의하면, 익셉션과 인터럽트는 비슷한 개념이지만 이벤트 발생 주체와 상황이 미묘하게 다른 개념이라고 설명한다.

해당 글의 정의에 의하면, 인터럽트는 외부 주변 장치나 외부 신호에 의해 발생하는 이벤트이고, 익셉션은 CPU 내부에서 발생하는 예외적인 상황에 대한 이벤트라고 한다. 예를 들어, 나눗셈 연산을 할 때, 0으로 나누면 CPU 내부 연산에 의한 예외적인 상황이므로 익셉션이 발생된다. Timer 시간이 초과되거나 통신 데이터 수신이 들어오는 것 처럼 외부 장치의 동작에 의해 발생하는 경우 인터럽트가 발생한다.

ARM Cortex-M 은 인터럽트를 익셉션에 포함되는 개념으로 본다

하지만 Cortex-M3 technical manual을 보면, ARM Cortex-M 시리즈는 인터럽트를 익셉션에 포함되는 개념으로 본다. 다시말해 외부에서 발생하는 장치 신호도 익셉션, 내부에서 발생하는 시스템 오류나 OS 관리를 위한 이벤트도 Cortex-M은 익셉션으로 본다. 앞으로 단어 이해에 혼동이 없도록 하자.

그래서... PendSV와 SysTick은 어떤 익셉션/인터럽트?

SysTick : Armv7-M의 RTOS용 타이머

Armv7-M 프로세서 내부에는 24비트(대략 16M까지 셀 수 있음) 타이머인 SysTick이 있다. RTOS는 이 타이머를 이용해 시스템의 최소 시간 단위인 Tick(일반적으로 1ms)을 만든다. 이 SysTick 익셉션은 RTOS의 알람같은 존재이다. 이 익셉션이 주기적으로 발생할 때 마다 스케쥴러가 깨어나 현재 실행중인 Taks보다 더 높은 우선순위의 Task가 Ready Queue에 있는지, 혹은 현재 Task가 너무 오래 실행되었는지(Timeout) 검사하여 상황에 맞게 Premption을 수행한다.

PendSV : 가장 우선순위가 낮아야 하는 익셉션

PendSV(Pended Service Call)는 Armv7-M 프로세서에서 Context Switching을 안전하게 처리하기 위해 설계된 특별한 익셉션이다. SysTick이 1ms마다 인터럽트를 발생시켜주면, PendSV는 실제로 문맥전환을 해주는 역할을 수행한다.

 

1. 왜 Pend(대기)라는 이름이 붙었지?

일반적인 인터럽트는 발생 즉시 CPU의 실행 흐름을 가로채지만, PendSV는 대기(Pending) 상태로 설정될 수 있는 특성을 가진다. 그 이유는 익셉션 중 가장 낮은 우선순위를 가지기 때문이다. 따라서 더 중요한 다른 인터럽트가 처리 중이라면 그 작업들이 모두 끝날 때까지 순서를 기다린다.

 

SysTick과 PendSV의 기작

  1. SysTick 인터럽트가 주기적으로 발생해 현재 실행 중인 태스크의 Timout과 더 높은 우선순위 Task가 준비되었는지를 검사한다.
  2. 만약 다른 태스크로 교체해야 한다면, SysTick 핸들러는 직접 태스크를 바꾸는 대신 PendSV를 Pending 상태로 만든다.
  3. 이때 PendSV의 우선순위는 보통 시스템에서 가장 낮게 설정되어 있다. 따라서 현재 다른 인터럽트 서비스 루틴(ISR)이 실행 중이라면 PendSV는 실행되지 못하고 대기한다.
  4. 모든 인터럽트 처리가 완료되는 시점에 PendSV 핸들러가 실행된다. 여기서 드디어 현재 태스크의 레지스터를 스택에 저장하고, 다음 태스크의 레지스터를 불러오는 실제 컨텍스트 스위칭이 발생한다.

만일 PendSV 없이 SysTick 내부에서 즉시 문맥 전환(Context Switching)을 시도한다면, 중첩된 인터럽트(Nested Interrupt) 상황에서 시스템이 꼬이는 결함이 발생할 수 있다. 예를 들어보자. Task A를 실행하다가 들어온 GPIO Interrupt를 처리중에 SysTick인터럽트가 발생해 Task B로 문맥 전환을 해준다고 해보자... GPIO Interrupt는 수행되지 못하고 Task B가 CPU를 선점하며 GPIO ISR은 영원히 잊혀진다.

따라서, PendSV 익셉션 이용해 모든 인터럽트가 종료된 시점까지 문맥 전환을 미룸으로써, OS가 하드웨어의 흐름을 방해하지 않고 부드럽게 태스크를 전환할 수 있게 할 수 있다.

 


https://etst.tistory.com/465 님의 블로그 글을 참고하였습니다.

https://austindhkim.tistory.com/622 님의 블로그 글을 참고하였습니다.

'Embedded Systems > Arm 아키텍처' 카테고리의 다른 글

[Arm] 익셉션에 대해 공부해보자!  (0) 2026.04.02
[ARM] Armv7의 Processor Mode(동작 모드) + 조금의 익셉션  (0) 2026.03.26
[Arm] '#' immediate value(즉치값) 너는 누구니?  (0) 2026.03.26
[ARM] Arm 아키텍처의 메모리모델 - 노멀 메모리, 디바이스 메모리  (0) 2026.03.24
'Embedded Systems/Arm 아키텍처' 카테고리의 다른 글
  • [Arm] 익셉션에 대해 공부해보자!
  • [ARM] Armv7의 Processor Mode(동작 모드) + 조금의 익셉션
  • [Arm] '#' immediate value(즉치값) 너는 누구니?
  • [ARM] Arm 아키텍처의 메모리모델 - 노멀 메모리, 디바이스 메모리
jh-rrr
jh-rrr
기술의 깊이에 집중하며 성장하길 지향합니다.
  • jh-rrr
    Embedded World
    jh-rrr
  • 전체
    오늘
    어제
    • 분류 전체보기 (73) N
      • 소프트웨어 (18)
        • 프로그래밍 (2)
        • C (11)
        • Python (1)
        • 운영체제 (3)
        • 네트워크 (0)
      • Embedded Systems (24) N
        • 리눅스 (13)
        • MCU 기본 (2)
        • 임베디드 레시피 (0)
        • Arm 아키텍처 (5) N
      • Projects (1)
        • Cortex-M3 (1)
        • 재난 구조 로봇 (0)
      • AI (12)
        • Computer Vision (2)
        • Deep Learning (4)
        • cs224n (2)
        • cs231n (2)
      • 취업 준비 (1)
        • 프로젝트 & 자격증 (1)
      • 엔지니어링 뉴스 (3)
      • Paper Reviews (4)
      • Insights (7)
        • Seminar ! (2)
        • 서평 (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    리눅스 오류
    일귀
    stm32f 시리즈를 이용한 arm cortex-m3/m4 구조와 응용
    리눅스
    커널 이미지란
    OS 이미지
    essential deep learning paper reading
    conda: command not found
    kernel image 란
    커널 이미지
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
jh-rrr
[ARM] 익셉션? 너는 누구니?
상단으로

티스토리툴바