스타트업 코드: main 전에 일어나는 일
리셋 직후 CPU는 .data를 RAM으로 복사하고 .bss를 0으로 채운 뒤에야 main을 부릅니다. startup.s를 한 줄씩 따라갑니다.
리셋 순서
- CPU가 벡터 테이블 0번 주소에서 초기 스택 포인터 값을 읽어 sp에 넣음
- 1번 주소에서 Reset_Handler 주소를 읽어 점프
- Reset_Handler가 아래 작업을 수행
SystemInit(): 클럭, Flash 대기 상태 같은 기본 설정main()호출
Reset_Handler가 하는 일
- .data 복사:
int count = 5;처럼 초기값이 있는 전역 변수는 그 초기값이 Flash에 저장되어 있습니다. 이것을 RAM의 변수 위치로 복사합니다. - .bss 초기화:
int total;처럼 초기값이 없는 전역 변수 영역을 0으로 채웁니다. C 표준이 전역 변수는 0으로 시작한다고 보장하기 때문입니다. - C++ 생성자 / 라이브러리 초기화 (
__libc_init_array)
실무에서 만나는 문제
- 부트로더에서 앱으로 점프했는데 변수 값이 이상하다면 앱의 스타트업이 제대로 실행됐는지 확인합니다.
- 전원이 꺼져도 남겨야 하는 값(리셋 원인 기록 등)은
.noinit섹션에 두어 .bss 초기화를 피합니다. - RAM이 큰 칩에서 .bss를 0으로 채우는 시간이 부팅 시간에 영향을 주기도 합니다.
영상으로 이어 보기공부법과 진로 시리즈 15편2025 임베디드 프로그래밍 공부 순서 | 공부 방법 | 로드맵PROJECT COURSE레지스터 설정을 실제 보드에서 해 보고 싶다면밸런싱 로봇 하나를 요구사항, 회로와 PCB, 펌웨어, 앱까지 실무 순서대로 만드는 강의입니다. 10파트 165강.강의 살펴보기 →FREE PDF무료 전자책 3권 받기이 주제를 한 권으로 이어서 읽고 싶다면. BLDC 모터 제어, 직렬통신, 센서를 책 분량으로 묶었습니다. 이메일만 남기면 바로 받습니다.무료로 받기 →