난 그냥 임베디드 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
이어야합니다.
세 번째 시나리오가 가장 가능성이 높지만 링커 스크립트에 따르면 이는 사실 일 수 없습니다. 누군가가 이것에 대해 밝힐 수 있습니까?
, 그것은 세 번째 옵션입니다. AT()는 링커가 .emfunc 및 .data 섹션 (둘 다 읽기/쓰기)을 _etext에서 시작하는 개체 파일에 넣도록 지시합니다. "> ram"은 섹션이 RAM에있는 것처럼 재배치를 해결하도록 링커에 지시합니다. 그 결과 복사 루프는 프로그램이 시작될 때 읽기 전용 영역에서 읽기/쓰기 영역으로 데이터를 이동시킵니다. –
@RichardPennington Awesome, 대답의 형태로 이것을 추가 할 수있을 것 같습니까? 아마도'AT()'지시어를 다루는 ld 매뉴얼의 인용문을 넣을 수 있습니까? –