2017-04-26 9 views
0

Keil과 함께 예제 프로젝트를 컴파일하여 * .o 파일을 만든 다음, 기본 주소 인 0x08000000 대신 원하는 주소로 * sct 파일을 편집하고 * .elf를 지정된 로딩과 함께 생성했습니다 및 주소를 실행.특정 주소를 가진 elf 파일 생성하기

* .elf 파일을 플래시 메모리에로드했는데 작동했습니다. 지정된 주소에서 다운로드되었지만 메모리를 검사했을 때 * .o 파일을 건드리지 않고 매번 링커라고 불렀으므로 데이터가 변경된 것으로 나타났습니다.

내 질문은, 왜 같은 * .o로 주소를 변경하면 내 데이터에도 영향을 미칩니 까?

답변

1

대부분의 임베디드 플랫폼에 따라야하는 몇 가지 규칙이 있습니다.

  1. 리셋 핸들러와 벡터 테이블은 하드웨어가 지정한 정의 된 위치에 있어야합니다.

  2. 리셋 부팅 영역에 대해 서로 다른로드 및 실행 주소 영역 (LR/ER)을 사용할 수 없습니다. 링커는로드 영역의 데이터를 실행 영역에 복사하는 스크립트를 삽입합니다 (중복되지 않는 경우). 아래의 영역 RW_IRAM1과 같이. 정상적인 조건에서는 플래시에 쓸 수 없으므로 실패합니다.

  3. 컴파일 후 메모리 영역과 독립적으로 컴파일되지 않은 메모리 영역은 변경할 수 없습니다. 코드에는 절대 점프가 포함될 수 있습니다.
    예 : foo()은 0x0800400으로 이동하십시오. 또는 char x에 대해 0x0802FFE을 읽으십시오.

유효한 스 캐터 파일의 예입니다.

LR_IROM1 0x08000000 0x00100000 { ; load region size_region 
    ER_IROM1 0x08000000 0x00001000 { ; load address = execution address 
    *.o (RESET, +First) ; boot code 
    *(InRoot$$Sections) ; linker loader parts, initializes RW_IRAM1 
    .ANY (+RO)   ; your code 
    } 
    RW_IRAM1 0x20000000 0x00020000 { ; RW data 
    .ANY (+RW +ZI) 
    } 
} 

외부 메모리 용 추가로드 영역 (LR)을 추가 할 수 있습니다. loader application이 인터페이스를 설정하는 경우.
비 휘발성 메모리 에뮬레이션과 같은 추가 영역을 추가 할 수 있습니다. 프로그래밍 도중 미리로드되거나 건너 뛸 수 있습니다.

여기서 the linker에 대한 모든 것을 찾을 수 있습니다. 어느 부분에 스 캐터 로딩이 있습니다.

+0

고맙습니다. 그렇다면 컴파일을 메모리 위치로 지정할 수 있는지 확인해야합니까? – erfaheel

+0

예.하지만 하드웨어의 시작 위치를 알려주기 위해 메모리의 처음 몇 단어에 뭔가를 써야한다는 것을 명심하십시오. – Jeroen3

+0

괜찮습니다. 감사합니다. – erfaheel

관련 문제