CPU: 프로그램 명령어 실행
MCU: CPU·GPIO·타이머·통신 장치·메모리 등을 포함한 칩
주변장치: GPIO·타이머처럼 특정 기능을 담당하는 하드웨어
폴링(polling): CPU가 버튼 상태를 반복해서 확인
인터럽트: 하드웨어가 사건 발생을 알림
CPU의 대응: 실행 조건 충족 시 기존 실행을 중단하고 처리 코드로 이동
| 용어 | 이 글에서의 의미 |
|---|---|
| 인터럽트 요청, IRQ | 처리가 필요하다고 CPU 쪽에 알리는 요청 |
| ISR, 인터럽트 핸들러 | 인터럽트를 처리하기 위해 실행하는 함수 |
| 레지스터 | CPU나 주변장치의 설정·상태·계산값을 담는 작은 하드웨어 저장 공간 |
| 비트, 플래그 | 레지스터 안의 0 또는 1로 표현되는 설정이나 상태 |
| 문맥(context) | 중단된 계산을 이어가기 위해 필요한 CPU 상태 |
| 스택(stack) | 나중에 넣은 정보를 먼저 꺼내는 방식으로 사용하는 메모리 영역 |
| 벡터 테이블 | 예외·인터럽트 종류에 대응하는 핸들러 시작 주소를 담은 표 |
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 스택 |

EXTI_PR.PR0EXTI_IMR.MR0 = 1IMR0 = 1은 EXTI0의 인터럽트 마스크 해제를 의미Pending: 해당 IRQ의 처리 요청이 대기 중인 상태0, 버튼 동작 시 1로 변화
5, B는 2main과 ISR이 MSP 사용, 부동소수점 프레임 없음| 구간 | 현재 CPU 실행 | 아직 완료되지 않은 ISR | 스택에 보관된 예외 프레임 |
|---|---|---|---|
| t0~t1 | main | 없음 | 없음 |
| t1~t2 | ISR A | A | main을 재개할 문맥 |
| t2~t3 | ISR B | A, B | main 문맥 + A를 재개할 문맥 |
| t3~t4 | ISR A | A | main을 재개할 문맥 |
| t4 이후 | main | 없음 | 이 두 인터럽트의 프레임은 모두 해제됨 |

2, B는 5이므로 B는 Pending으로 대기EXC_RETURN, SRAM 스택
5의 A에 진입하기 위해 main 문맥 저장 시작2의 B 요청 발생
| 프레임 구성 | 크기 | 포함 내용 |
|---|---|---|
| 기본 프레임 | 32 B | R0~R3, R12, LR, 복귀 PC, xPSR의 8워드 |
| FP 확장 영역 | 추가 72 B | S0~S15, FPSCR, 예약 1워드 |
| FP 확장 프레임 전체 | 104 B | 기본 32 B + FP 확장 72 B |
| 정렬 공간 | 필요 시 추가 4 B | 8바이트 정렬을 맞추기 위한 공간 |
단위: 이 장치의 1워드 = 4바이트
프레임 선택: FPU가 존재한다는 이유만으로 모든 인터럽트에 FP 확장 영역이 붙는 것은 아님
전체 스택 사용량: 예외 프레임 + 필요한 정렬 공간 + 함수의 지역변수·추가 저장 영역
그림의 Lazy stacking 조건: main의 FP 문맥 보존 필요, FPCCR.ASPEN = 1, FPCCR.LSPEN = 1
| ISR의 동작 | FP 문맥 처리 |
|---|---|
| FP 미사용 | FP 값을 메모리에 저장·복원하는 작업 없이 복귀 가능 |
| FP 사용 | 첫 FP 명령 처리 전에 기존 FP 값을 예약 영역에 저장, 복귀 시 저장한 FP 상태 복원 |
SCB_CCR.STKALIGN = 1이고 진입 전 스택 위치에 보정이 필요하면 4바이트 추가| 관련 레지스터·비트 | 역할 |
|---|---|
FPCCR.ASPEN | FP 명령 실행에 따른 FP 문맥 활성화 추적과 자동 보존 지원 |
FPCCR.LSPEN | FP 문맥의 지연 저장 허용 |
FPCCR.LSPACT | FP 공간은 확보됐지만 값 저장이 보류 중인지 표시 |
FPCAR | 지연 저장을 위해 예약된 FP 영역의 주소 |
CONTROL.FPCA | 현재 FP 문맥의 활성 상태 |
EXC_RETURN[4] | 복귀에 사용할 기본·FP 확장 프레임 구분 |
SCB_CCR.STKALIGN | 예외 진입 시 스택의 8바이트 정렬 제어 |
| 확인하려는 내용 | 확인 대상 | 의미 |
|---|---|---|
| 입력이 실제로 바뀌는가? | GPIOA_IDR의 bit 0 | PA0 입력 상태 |
| 원하는 핀이 EXTI에 연결됐는가? | SYSCFG_EXTICR1 | EXTI0 입력 포트 선택 |
| 원하는 에지를 감지하는가? | EXTI_RTSR, EXTI_FTSR | 상승·하강 감지 조건 |
| 주변장치에서 사건을 기록했는가? | EXTI_PR.PR0 | EXTI 발생 기록 |
| 요청 전달이 허용됐는가? | EXTI_IMR의 bit 0 | EXTI0 인터럽트 경로 허용 |
| 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 | 복귀 모드와 사용할 스택·프레임 종류 |