80. 인터럽스와 일반함수 차이
9
投稿した質問数 27
일반함수나 인터럽트 함수 이름 차제가 포인터(시작 주소)이고, 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
回答 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로 선언할 필요는 없습니다.
감사합니다.
79. int main(void)선언 없이 어떻게 동작하나요 ?
0
13
1
79. int main(void)선언 없이 어떻게 동작하나요 ?
0
10
1
74. 포인터 크기는얼마인가요 ?
0
15
1
73. 왜 hex를 사용하나요 ?
0
15
2
71. 40초쯤에 소리가 안납니다.
0
8
1
70. 강의에 사용되는 보드는 어떤것인가요 ?
0
16
2
00. 인버터 회로만 보고 소비전력을 예측 가능하나요 ?
0
20
1
58강, 유니폴라, 바이폴라 방식중 바이폴라가 대세라고 보면 되나요 ?
0
17
2
57강. 모터인데 왜 전압제어를 하나요 ?
0
15
2
57강. PWM은 sine을 만들어 내는 걸로 이해 하면 되나요 ?
0
16
2
49강. 제어이론의 구체적 다이어그램 설명 요청드립니다.
0
18
2
55강. dead time을 고려하면, 원래의 original신호와는 달라지지 않나요 ?
0
13
2
스위칭 주파수 설정
0
34
2
P6KE47CA 이 부품에 대해서 궁금합니다.
0
42
1
교육용 보드 쓰로틀 질문입니다.
0
61
3
모스펫 기생 커패시터에 대한 내용 누락
0
48
1
강의 자료 어디 있을까요?
0
48
2
STM32 보드 연결 방법 없이 바로 코딩으로 넘어가서 당황스러운데
0
59
3
대역폭 강의 없어요.
0
49
2
섹션 3,4. 6,7강의듣고 섹션5나중에 들어도 괜찮은건가요?
0
54
2
아직 stm32F767 보드 없는데.. 펌웨어...
0
65
2
BOM 이 혹시 제공되나요?
0
54
2
36V 배터리가 아닌 24V 전원
0
59
2
타이머 실습
0
65
2

