컴퓨터/Embedded

startup code - main()은 누가 호출할까

mikasaAck 2023. 1. 22. 01:17
728x90

Intro

어떤 프로그램의 시작을 물어보면, 대부분 main함수라고 말한다.
그러나, 복잡도가 낮은 임베디드 시스템은 OS(운영체제)가 없다.
그렇다면, OS(운영체제)가 없는 시스템에서 main 함수는 어떻게 호출될까?
ARM Core를 기준으로 이해하려고 한다.


startup code

1. Entry Point 지정과 Exception Vector 설정
Entry Point를 지정하고, Exception Vector Table을 배치한다.

        AREA    INT_VECT, CODE, READONLY
        CODE32                         ; 32 bit ARM instruction

        ENTRY
        B       Reset_Handler                   ; 0x0
        B       Undefined_Handler               ; 0x4
        B       SWI_Handler                     ; 0x8
        B       Prefetch_Handler                ; 0xC
        B       Abort_Handler                   ; 0x10
        B       Reserved_Handler                ; 0x14
        B       RAM_IRQ_VECTOR                  ; 0x18
        B       RAM_FIQ_VECTOR                  ; 0x1C

ENTRY는 binary image의 진입점을 의미한다.
Exception Vector Table의 reset vector를 Entry로 하는 이유는 뭘까?
power 인가 시, ARM Core가 SVC Mode로, PC값은 reset vector로 Setting 하기 때문이다.
따라서, reset vector에 reset handler로 branch하는 코드가 필요하다.


2. 초기화를 방해하는 장치 끄기
watch dog timer나 interrupt 등의 초기화를 방해하는 장치는 disable 해야 한다.
watch dog reset에 의해서, PC값이 다시 reset vector로 Setting 되기 때문이다.
또한, Interrupt에 의해 IRQ mode로 진입할 수 있는데, 아직 ARM mode별 stack이 생성된 시점이 아니기 때문에, 오동작 위험이 있다.

3. 시스템 clock 설정
시스템에 사용되는 clock을 설정한다.

4. memory configuration 설정
시스템에서 사용하는 ROM, RAM 등의 메모리에 필요한 설정을 한다.
메모리의 시작 주소와 크기, access 제어 등의 설정

5. ARM mode별 stack 생성
ARM은 7개 mode가 있고, 각 mode의 stack을 설정한다.
강제로 ARM Mode를 변경하여, SP(Stack Pointer)를 설정한다.

http://pds12.egloos.com/pds/200906/04/90/c0098890_4a27a9163d532.jpg

6. ROM의 data 영역(초기값 가지는 global, static 변수)을 RAM에 복사
7. bss 영역(초기값없는 global, static 변수)을 0으로 clear
8. main함수로 branch


reference

728x90
반응형