임베디드 스터디 - 스타트업 코드
임베디드 스터디 - 스타트업 코드
스타트업 코드
- C 언어의
main()을 실행하기 전 수행되는 동작
1
2
3
4
5
6
7
8
리셋 벡터 → Reset Handler 진입
① SP 초기화
② 워치독 비활성화
③ 클럭 설정 (PLL 초기화)
④ .bss 초기화 (0으로 클리어)
⑤ .data 복사 (Flash → RAM)
⑥ (C++ 환경이면) 전역 객체 생성자 호출
⑦ main() 호출
SP 초기화
- ARM Cortex-M은 리셋 직후 PC가 벡터 테이블에서 리셋 핸들러 주소를 읽어옴
0x0000_0000: MSP(Main Stack Pointer) 초기값0x0000_0004: Reset Handler 주소
- SP를 초기화해야 이후 Stack에 쌓이는 지역변수, 함수들을 접근할 수 있음
워치독 비활성화
- 일정 시간 안에 신호(킥)이 없으면 MCU를 강제로 리셋시키는 모듈
- 펌웨어 무한 루프 탈출, MCU가 죽었을 때 리셋용
- 워치독이 실행된 상태에서 스타트업 코드가 실행되면
.data영역 복사 중에 리셋이 발생할 수 있음- 리셋 → 스타트업 → 리셋 무한반복
- 워치독은 이후
main()에서 세팅하여 다시 실행하거나, 디버깅용으로 실행을 안하는 경우도 있음
클럭 설정
- 리셋 직후 MCU는 내부 RC 오실레이터를 바탕으로 클럭 동작을 수행함
- 원하는 MCU 클럭 설정을 위해 PLL(Phase Locked Loop)을 설정
.bss 초기화
- 전역 변수 중에 초기값이 없는 변수는 모두 0으로 초기화시킨다
.data 복사
- 전역 변수 중에 초기값이 있는 변수는 Flash 메모리에서 해당 초기값을 메모리로 복사해야한다
| 변수 | 섹션 | 위치 | 스타트업 처리 |
|---|---|---|---|
int a = 100 | .data | Flash→RAM 복사 | ROM에서 RAM으로 복사 |
const int a = 100 | .rodata | Flash에 그대로 | 복사 불필요 |
int b | .bss | RAM | 0으로 초기화 |
C++ Class 생성자 호출
- C++의 Class는 단순히 메모리 복사, 초기화로만 설정할 수 없음
- 생성자 코드가 실제로 실행돼야 제대로 된 Class 사용 가능
- Class 생성자는
.init_array섹션에 배정되어 생성자 함수 포인터를 순서대로 호출
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.