전원이 들어오면 CPU 는 벡터 테이블의 두 번째 워드(리셋 벡터)로 점프한다. 그 자리가 이 함수다.
하는 일 순서
① 스택 포인터 설정 벡터 테이블 첫 워드에서 하드웨어가 이미 로드
② .data 복사 플래시에 있던 초기값을 SRAM 으로 옮긴다
③ .bss 0 으로 채운다 초기화 안 한 전역이 0 이 되는 이유
④ 클럭·FPU 등 초기화 SystemInit
⑤ C 라이브러리 초기화
⑥ main 호출
②가 왜 필요한가
int counter = 5; // 초기값 5 는 전원이 꺼져도 남아야 하니 플래시에 있고
// 실행 중에는 바꿔야 하니 SRAM 에 있어야 한다
그래서 플래시에 원본, SRAM 에 사본을 두고 부팅 때 복사한다. 이 복사를 건너뛰면 전역 변수가 쓰레기 값으로 시작한다.
실무에서 여기를 의심할 때
부팅이 안 될 때 가장 먼저 보는 곳이다. 링커 심볼이 잘못돼 복사 범위가 틀리면 증상이 "왜인지 전역 값이 이상하다" 로 나타난다.