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 라고 부름
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 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 |