임베디드/임베디드 레시피

Reset Handler에서 main까지 (Entry Point)

twoweeks-within 2024. 12. 1. 23:00

ARM core Embedded System Power on == Reset Exception
 >  SVC mode > Reset Vector > PC setting 
  Reset Vector( Low Vector ) : 0x0 // Reset Handler로 branch하는 code가 있음

Exception Vector

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

ENTRY

B       Reset_Handler                       ; 0x0  // Reset Handler로 branch
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


 Reset Handler

Hardware적인 설정
0) Hardware적으로 자동으로 IRQ/ FIQ disable, SVC로 이곳에 진입.
1) 기본적으로 사용되는 HW block들의 clock 설정
2) 기본적인 MCU의 pin 설정
3) MCU에서 bootup에 필요 없는 HW block을 죽임.
4) Memory Setting → Memory Sizer (Bus width)라든가, Wait State등


Software적인 설정
1) 각 mode별 Stack setting
2) RW : RAM에 복사.  RO 복사 (XIP가 SDRAM 에서 할경우) . ZI : 굳이 복사 X > 0으로 채움
   >RW : 변수의 초기화, ZI : 0으로 initialization

 C 함수로 건너뛰기 위한 main함수 호출 : Reset Handler의 마지막
  __rt_entry :  main()함수 호출

>> 보통은 Start up code 또는 Boot up code 라고 부름

 

ARM - Application Note 107 , main을 C library에 불러옴

 

 

 Entry point를 따로 구현 X > 일반적인 ADS로 compile한 Application은 어떻게 구성?

 main() : user의 entry point
 __main : Kernel, Processor의 Entry point

 __main : application이 실행되기 위한 entry point
1) 실행시의 Memory Map을 setting,
2) SDRAM에서 XIP를 할 경우에는 Code, Data를 SDRAM에 복사,
// NAND : XIP 불가 > SDRAM 에 복사
3) Default Memory Model의 ZI region을 0으로 initialization 

__rt_entry : C library 자체를 실행 가능하도록 해줌
 // rt == real time 
 __main에서 자동으로 __rt_entry를 부르게 되어 있음,
 C library에서 사용하는 Stack과 Heap을 잡고, library 함수와 library내부의 static data를 initialization.
  자동으로 main() 함수를 부름 > main() 함수가 부름

Linker입장) main()함수가 있으면.. 
__main과 __rt_entry에 Memory Map 잡는 것 == C Library initialization 과정을 넣어 주라고 하는 것
 > (if) main()이라는 함수 X >  Initialization 과정 link X > C Library 제대로 사용 X

C Library : Semi hosting을 사용하기 위해서 필요

 일반적인 ARM Embedded system Entry :
 C library > X
 Reset Vector > O 
>  __main을 대신해야 함
 > Vector Table을 만들 때 __main Label을 Reset_Handler 앞에다 걸어주고 + EXPORT   __main

 Linker : Library의 __main을 무시하고, Reset_Handler를 __main 자리에 대신 만들어줌
주의) __main이 없는 경우 : Linker가 _main이라는 Symbol을 찾아댕김.

EXPORT   __main
EXPORT   _main
//  __main~= _main

AREA    INIT_VECTOR, CODE, READONLY
CODE32

__main
_main
ENTRY

B       Reset_Handler
B       Undefined_Handler
B       SWI_Handler
B       Prefetch_Handler
B       Abort_Handler
B       Nothing_Handler
B       IRQ_Handler
B       FIQ_Handler


C Library 안쓰려면..
  Reset Hander가 끝나는 시점에 __rt_entry 대신 main() 함수를 직접 불러주면 C library를 init X 
<>  __rt_entry를 쓰게 되면 main() 함수는 꼭 있어야함.

 Entry point가 없다면.. Linker > Error , Image view (executive) 를 만드는 것에 실패

 

 

Entry : Reset Vector

 

 

//

보통 Entry Point 구현한 Assembly file 이름 Crt0.S , init.S, startup.S, reset_handler.s 등
 Crt0.S :  C-Runtime 0의 약자, 

 PC용 프로그램 : main()함수만 만들어 놓으면 그쪽으로 Entry되는 것  > X
Standard Library중 crt0.o 라는 곳에 Entry Point가 있음 > link할 때 crt0.o 엮임
 file 실행 > crt0.o의 Entry point를 거쳐서 main()으로 오게 됨

'임베디드 > 임베디드 레시피' 카테고리의 다른 글

Context와 AAPCS  (0) 2024.12.03
Scatter Loading 주의점, heap 및 stack  (2) 2024.12.02
Coprocessor Assembly  (0) 2024.11.27
SWI 의 진실  (0) 2024.11.26
vector table의 구현과 실제  (0) 2024.11.26