Binary를 Upload할때 주의사항

머 당연한 이야기이지만, 아무리 우리가 소프트웨어적으로 메모리멥을 만들어서 컴파일시에 사용한다고 하더라도, 단말에 올라갔을때는 해당 Segment를 소프트웨어적으로 복사(즉, 초기화)해주는 과정이 필요하다(단, Firmware와 같은 경우, OS가 있고 Application을 올리는 경우는 제외, 제외의 예가 Windows의 EXE)

EWARM에서는 다음과 같이 해주면 된다.

예)

#pragma segment="DATA_ID"
#pragma segment="DATA_I"
#pragma segment="DATA_Z"
#pragma segment="DATA_C"
#pragma segment="CODE_ID"
#pragma segment="CODE_I"

unsigned int gVar = 0x12345678;

extern int main();


void
MyMain()
{
      unsigned int k, n;

      unsigned char * pDATA_ID;
      unsigned char * pDATA_I;
      unsigned char * pDATA_Z;
      unsigned char * pDATA_C;

      pDATA_ID = __sfb( "DATA_ID" );
      pDATA_I = __sfb( "DATA_I" );
      pDATA_Z = __sfb( "DATA_Z" );
      pDATA_C = __sfb( "DATA_C" );
     
      for(k = 0; k < (unsigned int)__sfe( "DATA_ID" ) - (unsigned int)__sfb( "DATA_ID" ); k++)
        *pDATA_I++ = *pDATA_ID++;

cf) __sfb는 segment의 시작 주소를 얻는 pseudo code이고, __sfe는 segment의 끝 주소 + 4의 pseudo code이다. 

cf2) 위에서 주위해야 할 것은 데이터를 복사할때 한바이트씩 복사하는데 이것은 segment의 끝 주소가 항시 4의 배수가 아닐 수도 있기 때문이다.(단, segment의 alignment를 하면 가능하다.)

* Segment등을 소프트웨어에서 초기화해주어야 하는 이유?

생각해보면 간단하다. Segment와 같은 개념은 사용자가 프로그래밍 할때 메모리 배치와 관련되어서 잘하기 위해서 만든거지 Hardware가 지원해주는 것은 아니기 때문이다. 즉, 하드웨어는 메모리상에 배치된 데이터만을 가지고 움직인다. 그것이 세그먼트인지 아닌지는 상관없다. ㅋ

* EWARM에서 특정 함수를 RAM에 올리는 방법

보통 CODE등은 ROM에서 실행된다. 하지만 특정함수는 RAM에 올려야 한다.(뭐 Dynamically Code Generation때문인듯)
이 경우 사용하는 keyword는 __ramfunc이다. 이것을 사용하면, 해당 함수는 RAM에 올라가야만 실행될 수 있다.(RAM주소에 맞게 relocation되어 있기 때문에, RAM에 올려야 한다.)

이 경우 CODE_ID를 CODE_I에 복사해야 한다.

이 글과 관련있는 글을 자동검색한 결과입니다 [?]

by dyanos | 2008/03/27 14:36 | ARM | 트랙백

트랙백 주소 : http://dyanos.egloos.com/tb/1556730
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
※ 로그인 사용자만 덧글을 남길 수 있습니다.

◀ 이전 페이지          다음 페이지 ▶