2016-12-24 13 views
4

난 그냥 임베디드 ARM 개발을 시작하는거야, 정말 나를 괴롭히는 것 코드의 조각있다 :이해 ARM은 코어 텍스 M0 + 재배치

/* Initialize the relocate segment */ 
pSrc = &_etext; 
pDest = &_srelocate; 

if (pSrc != pDest) 
{ 
    while (pDest < &_erelocate) 
    { 
     *pDest++ = *pSrc++; 
    } 
} 

_etext_srelocate 링커 스크립트에 정의 된 상징은 : ram 원점 메모리 세그먼트이다

. = ALIGN(4); 
_etext = .; 

.relocate : AT (_etext) 
{ 
    . = ALIGN(4); 
    _srelocate = .; 
    *(.ramfunc .ramfunc.*); 
    *(.data .data.*); 
    . = ALIGN(4); 
    _erelocate = .; 
} > ram 

0x20000000이다. 내가봤을 때의 문제는 _etext이 인 다른 메모리 세그먼트의 일부인 .text 세그먼트의 끝 경계를 표시하는 기호라는 것입니다. 즉, 앞서 언급 한 메모리 세그먼트가 100 % 가득 차 있지 않으면 _etext != _srelocate이 항상 true가됩니다. 이것이 의미하는 바는, .text 섹션을 넘어선 메모리를 복사한다는 것입니다. 링커 스크립트에 따라 아무 것도 정의되어 있지 않습니다. 나에게

,이) 중 A) 거기 .text 섹션을 넘어 rom 쓰레기 존재이며,이 .data.relocate에 복사 (그리고 이후에 도착, 세 가지 시나리오 중 하나에 리드, 또는 B) .text 이상 메모리가 비어 있습니다 디바이스 프로그래밍 이전에 칩 지우기 연산을 수행 한 경우, .relocate은 0이됩니다. C) 값이 .text 이후에 놓여져 rom에 위치하는 약간의 마술이 발생하고 ram에로드해야합니다. 이 경우 주석은 s/relocate/data이어야합니다.

세 번째 시나리오가 가장 가능성이 높지만 링커 스크립트에 따르면 이는 사실 일 수 없습니다. 누군가가 이것에 대해 밝힐 수 있습니까?

+0

, 그것은 세 번째 옵션입니다. AT()는 링커가 .emfunc 및 .data 섹션 (둘 다 읽기/쓰기)을 _etext에서 시작하는 개체 파일에 넣도록 지시합니다. "> ram"은 섹션이 RAM에있는 것처럼 재배치를 해결하도록 링커에 지시합니다. 그 결과 복사 루프는 프로그램이 시작될 때 읽기 전용 영역에서 읽기/쓰기 영역으로 데이터를 이동시킵니다. –

+0

@RichardPennington Awesome, 대답의 형태로 이것을 추가 할 수있을 것 같습니까? 아마도'AT()'지시어를 다루는 ld 매뉴얼의 인용문을 넣을 수 있습니까? –

답변

1

맞습니다. 세 번째 옵션입니다. 는 AT()는 _etext 에서 시작하는 객체 파일에 .ramfunc.DATA 섹션 (둘 다 읽기/쓰기됩니다) 넣어 링커를 알려줍니다. "> ram"은 섹션이 RAM에 배치 된 것처럼 재배치를 해결하도록 링커에 지시합니다. 여기에 설명 된대로 MEMORY 명령을 사용하여 이루어집니다 : https://sourceware.org/binutils/docs/ld/MEMORY.html#MEMORY 결과적으로 복사 루프가 읽기 전용 영역에서 읽기/쓰기 영역으로 이동합니다.

는 여기에 설명되어있는 LMA (로드 주소)를 제어하는 ​​GNU ld 개 문서에 대한 링크입니다 : 당신이 옳은 것 https://sourceware.org/binutils/docs/ld/Output-Section-LMA.html