Tasking 컴파일러 Data Initialize 코드 분석

TRACE32
이동: 둘러보기, 검색

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;

데이터 초기화 루틴 종료