그라운드 임베디드 유튜브 구독

노트 / 기계어와 어셈블리

스타트업 코드: main 전에 일어나는 일

리셋 직후 CPU는 .data를 RAM으로 복사하고 .bss를 0으로 채운 뒤에야 main을 부릅니다. startup.s를 한 줄씩 따라갑니다.

GROUND EMBEDDED · 정리 노트기계어 05스타트업 코드01리셋 순서02Reset_Handler가하는 일03실무에서만나는 문제

리셋 순서

  1. CPU가 벡터 테이블 0번 주소에서 초기 스택 포인터 값을 읽어 sp에 넣음
  2. 1번 주소에서 Reset_Handler 주소를 읽어 점프
  3. Reset_Handler가 아래 작업을 수행
  4. SystemInit(): 클럭, Flash 대기 상태 같은 기본 설정
  5. main() 호출

Reset_Handler가 하는 일

  • .data 복사: int count = 5;처럼 초기값이 있는 전역 변수는 그 초기값이 Flash에 저장되어 있습니다. 이것을 RAM의 변수 위치로 복사합니다.
  • .bss 초기화: int total;처럼 초기값이 없는 전역 변수 영역을 0으로 채웁니다. C 표준이 전역 변수는 0으로 시작한다고 보장하기 때문입니다.
  • C++ 생성자 / 라이브러리 초기화 (__libc_init_array)

실무에서 만나는 문제

  • 부트로더에서 앱으로 점프했는데 변수 값이 이상하다면 앱의 스타트업이 제대로 실행됐는지 확인합니다.
  • 전원이 꺼져도 남겨야 하는 값(리셋 원인 기록 등)은 .noinit 섹션에 두어 .bss 초기화를 피합니다.
  • RAM이 큰 칩에서 .bss를 0으로 채우는 시간이 부팅 시간에 영향을 주기도 합니다.