포스트

임베디드 스터디 - 스타트업 코드

임베디드 스터디 - 스타트업 코드

스타트업 코드

  • 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.dataFlash→RAM 복사ROM에서 RAM으로 복사
const int a = 100.rodataFlash에 그대로복사 불필요
int b.bssRAM0으로 초기화

C++ Class 생성자 호출

  • C++의 Class는 단순히 메모리 복사, 초기화로만 설정할 수 없음
    • 생성자 코드가 실제로 실행돼야 제대로 된 Class 사용 가능
  • Class 생성자는 .init_array 섹션에 배정되어 생성자 함수 포인터를 순서대로 호출
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.