Tasking 컴파일러 Data Initialize 코드 분석
cstart.에서 data init 위한 함수 호출
_lc_copy_table
- Copy table에 데이터 정보가 있을때만 데이터 초기화 프로세스 진행.
- cstart.c에서 “extern cptab_t _lc_copy_table[];” 으로 선언되어 있음.
- cptab_t 는 _cptable.h에서 아래와 같이 선언되어 있음
_init()
1. for ( entry = _lc_copy_table; ; ++entry )
- entry에 __lc_copy_table의 정보를 input. 이때 _lc_copy_table에 생성되어 있는 정보는 아래와 같음.
2. idx = entry->space - spc_min;
- _cptable.h과 entry에 들어가 있는 메모리 정보에 들어가 있는 내용 참고
- entry->space는 spc_near를 가리킴. 즉 4.
- spc_min은 1.
- idx값은 3을 가지게 됨.
3. switch ( entry->action & 3 )
- entry->action은 ac_copy를 가리키며 1.
- 결국 switch case문은 1 & 3 연산으로 인해 case ac_copy: 로 진입함.
4. case ac_copy: _init_cpy_table[idx]( entry->length, entry->dst, entry->src );
- _init.c에 아래와 같이 정의되어 있음
- _init_cpy_table의 멤버들에 대한 선언은 아래와 같음.
- idx값이 3이였기에 _init_cpy_table[3]이 되고 near copytable인 _cptable_cpy_near( len_t length, dst_t dst, src_t src );를 가리키게 됨.
- entry->length는 8byte, entry->dst는 목적주소인 0xF620을, entry->src는 near data값이 flash영역에 들어간 시작 주소를 의미.
- 즉, flash영역에 할당된 near data 시작 주소부터 8byte 만큼 0xF620주소에 copy를 하게됨.
- ac_copy case문을 끝내고 나면 entry의 주소위치가 증가하게 되고 다음 copy table 위치의 값을 읽어오게 됨.
5. case ac_clear: _init_clr_table[idx]( entry->length, entry->dst);
- Entry의 결과가 아래와 같이 나오고 entry->action이 ac_clear를 가르킬 때 _init_clr_table 구문을 실행하게 됨.
- entry->length는 2byte, entry->dst는 목적주소인 0xF628을 가리킴
- 즉, 0xF628주소에 2byte만큼 사이즈를 0x0으로 초기화 함.
- ac_clear case문을 끝내고 나면 entry의 주소위치가 증가하게 되고 다음 copy table 위치의 값을 읽어오게 됨.
6. case ac_stop: return;
데이터 초기화 루틴 종료