NVIC 개념 & 동작 원리

moonsyu·2026년 9월 9일

stm32

목록 보기
6/10
post-thumbnail

1. NVIC의 개념

  • CPU: 프로그램 명령어 실행

  • MCU: CPU·GPIO·타이머·통신 장치·메모리 등을 포함한 칩

  • 주변장치: GPIO·타이머처럼 특정 기능을 담당하는 하드웨어

  • 폴링(polling): CPU가 버튼 상태를 반복해서 확인

  • 인터럽트: 하드웨어가 사건 발생을 알림

  • CPU의 대응: 실행 조건 충족 시 기존 실행을 중단하고 처리 코드로 이동

용어이 글에서의 의미
인터럽트 요청, IRQ처리가 필요하다고 CPU 쪽에 알리는 요청
ISR, 인터럽트 핸들러인터럽트를 처리하기 위해 실행하는 함수
레지스터CPU나 주변장치의 설정·상태·계산값을 담는 작은 하드웨어 저장 공간
비트, 플래그레지스터 안의 0 또는 1로 표현되는 설정이나 상태
문맥(context)중단된 계산을 이어가기 위해 필요한 CPU 상태
스택(stack)나중에 넣은 정보를 먼저 꺼내는 방식으로 사용하는 메모리 영역
벡터 테이블예외·인터럽트 종류에 대응하는 핸들러 시작 주소를 담은 표
  • 상황 예시: 센서값 계산 중 버튼 입력 발생
  • 보존할 정보: 중단된 실행 위치와 계산 중이던 값
  • 필요한 기능: 우선순위 판단 + 문맥 저장·복원

2. NVIC의 역할

  • NVIC: Nested Vectored Interrupt Controller

  • 위치·종류: Cortex-M4에 통합된 인터럽트 제어 하드웨어

  • 관리 대상: 요청의 대기 상태, 실행 허용 여부, 우선순위

  • 동작 방식: CPU의 예외 처리 기능과 함께 인터럽트 처리

  • Nested, 중첩: ISR 실행 중 더 높은 선점 우선순위의 ISR이 끼어들 수 있음

  • Vectored, 벡터 방식: 선택된 인터럽트에 해당하는 핸들러 주소를 벡터 테이블에서 찾음

  • Interrupt Controller, 인터럽트 제어기: 여러 요청 중 어떤 것을 처리할 수 있는지 판단함

담당하는 일이 예시에서 사용하는 정보
GPIO·SYSCFG·EXTI입력을 연결하고 변화를 감지해 요청 생성PA0, EXTI 설정, EXTI_PR
NVIC와 CPU의 예외 우선순위 판단 기능요청을 대기시키고 처리 가능 여부 결정Pending, Enable, Priority, Active, CPU 마스크
CPU문맥 저장, ISR 명령어 실행, 문맥 복원CPU 레지스터, 벡터 테이블, SRAM 스택
  • ISR 명령어 실행·문맥 저장·복원: CPU가 수행

3. 버튼에서 ISR까지의 전체 경로

STM32F446RE에서 외부 버튼 입력이 NVIC와 CPU를 거쳐 ISR 실행과 복귀로 이어지는 과정

  • 그림의 의미: 기능과 상태 변화의 관계를 표현한 개념도
  • 설정·상태 비트: 하드웨어의 감지·판단 회로에서 사용
  • 실제 동작: 신호가 레지스터를 차례로 통과하는 구조는 아니며, 일부 작업은 병렬로 진행
  1. 입력 변화 발생
  2. EXTI에서 발생 기록
    • 발생 기록: EXTI_PR.PR0
    • NVIC로의 요청 전달 허용: EXTI_IMR.MR0 = 1
    • 그림의 IMR0 = 1은 EXTI0의 인터럽트 마스크 해제를 의미
  3. NVIC에서 처리 대기
    • Pending: 해당 IRQ의 처리 요청이 대기 중인 상태
    • IRQ마다 대기 상태를 각각 기록
  4. 실행 허용·우선순위 판단
  5. CPU 문맥 저장과 벡터 조회
  6. ISR 실행 및 발생 원인 해제
  7. 예외 복귀로 중단된 코드 재개
  • 예시 조건: PA0 입력이 평소 0, 버튼 동작 시 1로 변화
  • 감지 조건: 상승 에지 감지, 필요한 초기화 완료
  • 배선에 따른 차이: 실제 입력 변화 방향은 버튼 배선과 풀업·풀다운 구성에 따라 결정

4. 우선순위·중첩 그림으로 복귀까지 따라가기

ISR A가 ISR B에 선점된 뒤 B에서 A로, A에서 main으로 복귀하는 순서

  • 우선순위: A는 5, B는 2
  • 우선순위 설정: 구현된 우선순위 비트를 모두 선점에 사용
  • 선점 관계: 숫자가 작을수록 우선순위가 높으므로 B가 A를 선점
  • 예시 조건: main과 ISR이 MSP 사용, 부동소수점 프레임 없음
  • 표의 범위: 중첩 과정에서 저장·복원되는 하드웨어 예외 프레임
  • 실제 스택: 각 함수가 추가로 사용하는 공간도 포함
구간현재 CPU 실행아직 완료되지 않은 ISR스택에 보관된 예외 프레임
t0~t1main없음없음
t1~t2ISR AAmain을 재개할 문맥
t2~t3ISR BA, Bmain 문맥 + A를 재개할 문맥
t3~t4ISR AAmain을 재개할 문맥
t4 이후main없음이 두 인터럽트의 프레임은 모두 해제됨

6. 예외 처리 최적화와 스택 사용량

  • 기준 장치: STM32F446RE의 Cortex-M4
  • 6-1·6-2의 그림 조건: 인터럽트 Enable·CPU 마스크 조건 충족, 우선순위 비트를 모두 선점에 사용
  • 우선순위 표기: 숫자가 작을수록 높은 우선순위
  • 그림의 스택 범위: 하드웨어 예외 프레임 표시, 함수의 지역변수·추가 저장 공간 제외

6-1. Tail-chaining: 다른 ISR로 바로 연결

  • 개념: ISR 종료 시 복귀할 문맥을 스택에 유지한 채 다음 ISR로 바로 연결하는 동작
  • 생략 대상: 기존 문맥을 CPU 레지스터로 복원한 뒤, 다음 ISR 진입을 위해 다시 저장하는 작업
  • 효과: ISR 사이의 불필요한 메모리 접근과 전환 시간 감소

STM32F446RE의 Tail-chaining: A와 B 사이에서 main 문맥을 스택에 유지

  • 발생 조건: 종료 시점에 바로 실행할 수 있는 Pending 예외 존재
  • 우선순위 기준: 복귀 후 실행될 코드보다 먼저 처리할 수 있는 요청인지 판단
  • 주의할 구분: 종료한 ISR보다 우선순위가 같거나 낮다는 사실만으로 Tail-chaining이 결정되지는 않음
  • main으로 복귀할 예정인 경우: 종료한 ISR과 같거나 낮은 우선순위의 요청도 조건을 만족하면 연결 가능
  1. main → ISR A: main 문맥을 스택에 저장하고 A 실행
  2. A 실행 중 B 요청: A는 우선순위 2, B는 5이므로 B는 Pending으로 대기
  3. A 완료: main 문맥을 복원하지 않고 B의 벡터를 조회해 B 시작
  4. B 실행: main 문맥은 스택에 그대로 유지
  5. B 완료: 추가로 실행할 요청이 없으면 main 문맥을 복원하고 main 재개
  • 저장되는 문맥: 이 예시에서는 main의 복귀용 문맥 한 개
  • A의 문맥: A는 완료됐으므로 다시 재개하기 위한 저장이 필요하지 않음
  • B의 문맥: 대기 중인 요청이므로 B의 실행 문맥을 미리 저장하지 않음
  • Active 변화: A의 처리 완료 → A의 Active 해제 → B의 Active 설정
  • 중첩 복귀와 구분: 실행하다 중단된 A를 복원해 이어가는 동작은 일반적인 예외 복귀
  • 관련 정보: NVIC의 Pending·Active·우선순위, CPU 마스크, 벡터 테이블, EXC_RETURN, SRAM 스택
  • 참고: ST의 예외 진입·복귀 설명, Arm의 Tail-chaining 우선순위 설명

6-2. Late arrival: 문맥 저장 중 진입 대상 변경

  • 개념: ISR 진입 준비 중 더 높은 우선순위의 요청이 도착하면, 먼저 실행할 ISR을 변경하는 동작
  • 발생 시점: 기존 코드의 문맥을 저장 중이며, 원래 선택한 ISR의 첫 명령은 아직 실행 전
  • 핵심 특징: 저장하던 문맥을 그대로 사용하므로 불필요한 추가 저장 감소

STM32F446RE의 Late arrival: A 실행 전 B가 도착하여 같은 main 문맥으로 B부터 처리

  1. A 요청 발생: 우선순위 5의 A에 진입하기 위해 main 문맥 저장 시작
  2. 저장 도중 B 요청: 더 높은 우선순위 2의 B 요청 발생
  3. 진입 대상 변경: main 문맥 저장을 계속하면서 B의 벡터 조회
  4. B 먼저 실행: B는 Active, 아직 시작하지 않은 A는 Pending
  5. B 완료: A가 실행 조건을 만족하면 Tail-chaining으로 A를 처음부터 실행
  6. A 완료: 추가 요청이 없으면 main 문맥을 복원하고 main 재개
  • 스택에 저장된 대상: main의 문맥
  • A 문맥을 추가하지 않는 이유: A가 아직 실행되지 않아 중단된 A의 상태가 없음
  • B 다음 A의 실행 위치: 중단 지점이 아닌 A의 핸들러 시작 주소
  • 일반 선점과 구분: A가 이미 실행 중일 때 B가 선점하면 main 문맥 위에 A 문맥을 추가 저장
  • 관련 정보: 우선순위 판단, A의 Pending 상태, B의 벡터 주소, 저장 중인 main 스택 프레임
  • 응답 시간: CPU 마스크, Pending 대기, 우선순위, 메모리 접근 지연 등에 따라 달라짐
  • 참고: Arm의 Late arrival·인터럽트 응답 설명, 실행 전 ISR과 중첩 인터럽트의 차이

6-3. FPU와 정렬: 실제 스택 사용량

  • FPU: 부동소수점 연산을 담당하는 하드웨어
  • 추가 보존 대상: 중단된 코드가 사용하던 부동소수점 레지스터와 상태
  • Lazy stacking: FP 문맥을 위한 공간을 먼저 확보하고, 실제 값 저장은 필요할 때까지 미루는 방식
  • 스택 정렬: 저장 위치를 정해진 바이트 경계에 맞추는 처리

STM32F446RE의 FPU 문맥: 기본·확장 프레임, Lazy stacking의 공간 예약과 값 저장, 스택 정렬

프레임 구성크기포함 내용
기본 프레임32 BR0~R3, R12, LR, 복귀 PC, xPSR의 8워드
FP 확장 영역추가 72 BS0~S15, FPSCR, 예약 1워드
FP 확장 프레임 전체104 B기본 32 B + FP 확장 72 B
정렬 공간필요 시 추가 4 B8바이트 정렬을 맞추기 위한 공간
  • 단위: 이 장치의 1워드 = 4바이트

  • 프레임 선택: FPU가 존재한다는 이유만으로 모든 인터럽트에 FP 확장 영역이 붙는 것은 아님

  • 전체 스택 사용량: 예외 프레임 + 필요한 정렬 공간 + 함수의 지역변수·추가 저장 영역

  • 그림의 Lazy stacking 조건: main의 FP 문맥 보존 필요, FPCCR.ASPEN = 1, FPCCR.LSPEN = 1

  1. 인터럽트 진입: 기본 레지스터 값 저장, FP 확장 영역의 공간 확보
  2. FP 값 저장 보류: 기존 FP 값은 FPU 레지스터에 남아 있음
  3. ISR의 FP 사용 여부에 따라 분기: 아래 두 경우 중 해당 경로로 진행
ISR의 동작FP 문맥 처리
FP 미사용FP 값을 메모리에 저장·복원하는 작업 없이 복귀 가능
FP 사용첫 FP 명령 처리 전에 기존 FP 값을 예약 영역에 저장, 복귀 시 저장한 FP 상태 복원
  • 특징: 불필요한 FP 값 저장·복원과 메모리 접근 감소
  • 공간과 저장의 차이: 실제 값 저장을 생략해도 예약된 스택 공간은 필요
  • 정렬 조건: SCB_CCR.STKALIGN = 1이고 진입 전 스택 위치에 보정이 필요하면 4바이트 추가
관련 레지스터·비트역할
FPCCR.ASPENFP 명령 실행에 따른 FP 문맥 활성화 추적과 자동 보존 지원
FPCCR.LSPENFP 문맥의 지연 저장 허용
FPCCR.LSPACTFP 공간은 확보됐지만 값 저장이 보류 중인지 표시
FPCAR지연 저장을 위해 예약된 FP 영역의 주소
CONTROL.FPCA현재 FP 문맥의 활성 상태
EXC_RETURN[4]복귀에 사용할 기본·FP 확장 프레임 구분
SCB_CCR.STKALIGN예외 진입 시 스택의 8바이트 정렬 제어

7. 동작을 추적할 때 확인할 레지스터와 저장소

  • 확인 순서: 입력 → 발생 기록 → 처리 조건 → ISR 실행·복귀
  • 관찰 기준: 비트 값은 실행 상황에 따라 변하므로 한 시점의 값만으로 원인을 단정하지 않음
확인하려는 내용확인 대상의미
입력이 실제로 바뀌는가?GPIOA_IDR의 bit 0PA0 입력 상태
원하는 핀이 EXTI에 연결됐는가?SYSCFG_EXTICR1EXTI0 입력 포트 선택
원하는 에지를 감지하는가?EXTI_RTSR, EXTI_FTSR상승·하강 감지 조건
주변장치에서 사건을 기록했는가?EXTI_PR.PR0EXTI 발생 기록
요청 전달이 허용됐는가?EXTI_IMR의 bit 0EXTI0 인터럽트 경로 허용
NVIC가 요청을 대기 중인가?NVIC_ISPR의 IRQ6 비트Pending 상태
해당 IRQ 실행을 켰는가?NVIC_ISER의 IRQ6 비트Enable 상태
실행할 수 있는 우선순위인가?NVIC_IPR, AIRCR.PRIGROUP, PRIMASK, BASEPRI우선순위와 마스크 조건
아직 처리 중인 IRQ는 무엇인가?NVIC_IABR선점된 ISR을 포함한 Active 상태
지금 실행 중인 예외는 무엇인가?IPSR 또는 ICSR.VECTACTIVE현재 예외 번호
ISR 시작 주소는 어디 있는가?SCB_VTOR와 벡터 테이블 항목ISR 진입 주소
원래 코드로 돌아갈 정보는 어디 있는가?MSP·PSP가 가리키는 SRAM 스택보존된 PC·레지스터·xPSR
어떤 방식으로 복귀하는가?ISR 진입 시 LR에 설정되는 EXC_RETURN복귀 모드와 사용할 스택·프레임 종류
  • 발생 기록: EXTI_PR
  • 처리 대기: NVIC Pending
  • 미완료 상태: NVIC Active
  • ISR 진입 주소: 벡터 테이블
  • 재개에 필요한 문맥: SRAM 스택

0개의 댓글