inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

전동킥보드로 배우는 임베디드 실전 프로젝트

인터럽트란? - NVIC, EXTI 이론

80. 인터럽스와 일반함수 차이

65

윤남경

작성한 질문수 36

0

일반함수나 인터럽트 함수 이름 차제가 포인터(시작 주소)이고, flash메모리의 text(code)영역에 존재 하다가, 실행할때 일반함수는 호출에 의해 이동하고 (복귀 주소는 LR에 저장) 인터럽트 함수는 벡터테이블에서 우선순위를 판단하여 실행 한다고 생각하면 될까요 ?


그리고 코딩시 volatile키워드가 필수적으로 요구된다고 이해하고 잇습니다.


Flash

├─ Vector table

Initial MSP value

Reset_Handler address

NMI_Handler address

HardFault_Handler address

TIM2_IRQHandler address

└─ .text

main machine code

motor_control machine code

calculate_torque machine code

TIM2_IRQHandler machine code



임베디드 stm32 hardware motordriver artwork

답변 1

0

제어쟁이

네, 전체적인 그림은 잘 이해하고 계십니다. 다만 몇 가지 표현만 정확하게 잡아두시면 좋습니다.

일반 함수와 인터럽트 함수 모두 컴파일이 끝나면 실제 실행 코드(machine code)는 Flash의 .text 영역에 들어갑니다. 따라서 그림처럼 motor_control(), calculate_torque(), TIM2_IRQHandler()의 코드가 모두 Flash에 존재한다고 생각하시면 됩니다.

다만 함수 이름 자체가 포인터다라고 표현하기보다는, 함수 이름을 식에서 사용하면 대부분의 경우 해당 함수의 시작 주소를 가리키는 함수 포인터처럼 변환된다고 이해하시면 정확합니다.

일반 함수는 예를 들어

main() → motor_control()

처럼 프로그램이 실행되다가 BL 같은 함수 호출 명령을 만나면 해당 함수 주소로 이동합니다. 이때 복귀에 필요한 주소는 LR(Link Register)에 저장되고, 함수가 끝나면 원래 실행하던 위치로 돌아옵니다.

인터럽트는 과정이 조금 다릅니다.

TIM2 Interrupt 발생 → NVIC가 인터럽트 판단 → CPU가 예외 진입 → Vector Table에서 TIM2_IRQHandler 주소 확인 → 해당 주소로 PC 이동

이런 흐름입니다.

여기서 한 가지 중요한 점은 Vector Table이 우선순위를 판단하는 것은 아닙니다. 인터럽트의 Pending 상태, Priority 등을 보고 어떤 인터럽트를 먼저 처리할지는 NVIC가 판단합니다. Vector Table은 해당 인터럽트가 선택된 이후에 실제로 어느 Handler로 이동해야 하는가를 알려주는 주소표 역할을 합니다.

또한 인터럽트 진입 시에는 일반 함수 호출처럼 단순히 LR에 복귀 주소 하나만 저장하는 것이 아니라, Cortex-M 하드웨어가 기존의 PC, xPSR, LR, R0~R3, R12 등의 상태를 스택에 자동으로 저장합니다. ISR이 끝나면 이 상태를 복원해서 인터럽트가 발생하기 직전에 실행하던 코드로 돌아갑니다.

volatile에 대해서는 한 가지 수정이 필요합니다. 인터럽트를 사용한다고 해서 volatile이 무조건 필요한 것은 아닙니다.

예를 들어,
volatile uint32_t timer_flag;

처럼 main()에서 읽고 ISR에서 값을 변경하는 등, 일반 코드와 ISR이 공유하면서 실행 흐름과 무관하게 값이 바뀔 수 있는 변수에 주로 volatile을 사용합니다. 컴파일러가 "이 값은 안 바뀌겠네"라고 판단해서 읽기 동작을 제거하는 것을 방지하기 위한 것입니다.

반대로 ISR 내부에서만 사용하는 지역 변수까지 전부 volatile로 선언할 필요는 없습니다.

감사합니다.

0

윤남경

자세한 설명 감사합니다.

종합적으로 이해 하려고 시도하는 중입니다.

시간이 더 필요한것 같습니다. ^^



Buck Converter design

0

56

2

uart 실습

0

66

1

VM 배선

0

61

2

듀티 조절 코드 질문

0

57

2

Query Regarding PCB Design and Manufacturing for Firmware Testing

0

60

3

홀카터 질문

0

48

1

C46~C48 크기

0

54

2

Teleplot 문의

0

53

1

MCU 선정 관련 문의

0

71

1

전류 센싱 문의

0

72

2

키트 구매 여부

0

78

3

소형모터 구동

0

52

2

stm 클럭설정

0

57

1

36. 전력은 900W가 될것 같습니다.

0

49

1

34.제너다이오드는 전류 분배기라고 생각하면 될까요 ?

0

42

0

33.제너다이오드와 tvs다이오드 모양이 동일합니다.

0

48

0

쓰로틀 V 변하지 않음

0

90

3

풀업 저항 크기와 커패시터 용량 선정 방법

0

70

2

86, data bit순서가 바뀌어야 할것 같습니다.

0

59

1

85. pwm사용에 기본구조 이해가 같이 요구되네요

0

60

1

dc모터 회전원리

0

66

2

83. volatile로 선언한 이유가 이해 안됩니다.

0

56

1

82. 16:50초 설명에 대한 오해 및 adc mode비교 자료

0

83

2

81. 소프트웨어 작성 방법론에 조언 부탁 드립니다.

0

76

2