문제

내 프로그램으로 팔을 사용하여 이클립스+CDT+yagarto(gnu toolchain)+OpenOCD.에서 몇 가지 예제 프로젝트(에서 yagarto 이트에 대한 예)내가 발견 링커는 스크립트(*.ld)는 곳에 많이 연결 정보를 지정된(함께 섹션으로 정의).실제로 내가 직면하지 않은 이전에 파일(아 그들을 필요로하지 않),그리고 나는 그들을 찾아 다소에서 이해하기 어려운었습니다.그래서 제 질문은 이용할 수 있는 하나의 같은 스크립트 파일한 대상 프로세서(STR710FZ2T6)내 모든 프로젝트나가 익숙해 쓰기에 있는 이 스크립트와 그들을 쓰기 위해 각 프로젝트입니다.는 경우 사용할 수 있는 단일 파일의 모든 프로젝트를 위한 특정한 대상 프로세서 수신 통보를 찾을 수있는 곳은 보편적이다.

도움이 되었습니까?

해결책

제 생각에는 제 3 사람마다 스크립트 나 솔루션이 다릅니다. 해결해야 할 여러 가지 문제가 있으며, 다른 링커는 다른 방식으로 문제를 해결할 것입니다. 나는 GNU가 흑 마법이 아니라면 너무 어려워 졌다고 생각합니다.

임베디드 시스템의 경우 종종 플래시 또는 eeprom 또는 다른 형태의 읽기 전용 메모리가 부팅됩니다. 다른 프로세서와 마찬가지로 ARM에는 벡터 테이블이 있습니다. 기본적으로 재설정 코드가있는 위치 및 인터럽트 등을 알려줍니다. 따라서 테이블은 특정 장소에 있어야하며 링커에 해당 특정 장소에 넣도록 지시해야합니다 (첫 번째). .

내가 사용하고 싶은 스크립트 중 하나는 다음과 같습니다.

MEMORY
{
    bob (RX) : ORIGIN = 0x0000000, LENGTH = 32K
    joe (WAIL) : ORIGIN = 0x2000000, LENGTH = 256K
}

SECTIONS
{
    JANE : { startup.o } >bob
}

나는 보통 Bob과 Joe 대신 Ram과 ROM을 이름으로 사용하지만 여기에서 이름이 무엇인지는 중요하지 않다는 것을 보여줍니다.

테마의 또 다른 변형 :

MEMORY
{
    rom(RX)   : ORIGIN = 0x00000000, LENGTH = 0x8000
    ram(WAIL) : ORIGIN = 0x20000000, LENGTH = 0x2000
}

SECTIONS
{
    .text : { *(.text*) } > rom
}

첫 번째는 파일을 링커 명령 줄에 어떤 순서로든 넣을 수 있지만 startup.o 파일에 벡터 테이블이 있어야합니다. 후자는 모든 파일 이름을 사용할 수 있지만 링커 스크립트의 첫 번째 파일에는 벡터 테이블이 있어야합니다.

arm-thumb-elf-gcc -Wall $(COPS) vectors.o putget.o blinker2.c -T memmap -o blinker2.elf

또는 LD로 직접

arm-thumb-elf-ld vectors.o putget.o blinker2.o -T memmap -o blinker2.elf

RX는 링커에 해당 메모리 섹션에 읽기 및 실행을 넣도록 지시하며 Wail은 기본적으로 다른 모든 것입니다. 예를 들어 램이 하나만 있으면 RAM이 어디에 있는지 알려주는 모든 플래그 rxwail을 라인에 넣을 수 있습니다. 이 경우 로더에 따라 엘프 파일에 의존하여 로더를 지점으로 시작할 위치를 알려 주거나 바이너리의 시작 부분과 로더가 더 간단 할 수 있습니다. 암 (Cortex-M3이 아님)은 재설정 벡터의 첫 번째 벡터로서 분기 명령어를 가지므로 RAM 솔루션의 경우 벡터 테이블을 작성하는 척하면 작동합니다.

이 솔루션의 문제는 나를 괴롭히지 않는 많은 문제입니다. 선언 중에가 아니라 코드에서 변수를 초기화합니다.

이것

int rx;

int main ( void )
{
  rx = 7;

대신에

int rx=7;

int main ( void )
{

또한 코드가 시작될 때 변수가 0이라고 가정하지 않습니다. 시작하기 전에 항상 무언가로 초기화합니다. 팀으로서의 스타트 업 코드 + 링커 스크립트는 BSS 코드의 재설정을 더 쉽게 자동화하고 부팅시 ROM에서 RAM에서 0이 아닌 Init 데이터를 복사 할 수 있도록 협력 할 수 있습니다. (int rx = 7; 위는 ROM 어딘가에서 값 7을 복사하고 변수 rx에 할당 된 RAM의 메모리 위치에 쓸 수있는 일부 코드가 필요하여 Main ()가 시작될 때 7이 시작되도록합니다.

내 부팅 코드 도이 방법의 결과로 매우 간단합니다.

.globl _start
_start:
    b reset
    b hang
    b hang
    b hang
    b hang
    b hang
    b hang
    b hang
    b hang
    b hang
    b hang
    b hang
    b hang
    b hang
    b hang

hang : b hang

reset:
    ldr sp,=0x10004000
    bl main
    b hang

스타트 업 코드와 링커 스크립트가 함께 작동하여 하드 코드 스택 포인터, 힙 공간 등을 사용할 수있는 솔루션을 보거나 읽을 것입니다. 다시 많은 작업을 복잡한 시작 코드 및 링커에 넣을 수 있습니다. 자동화를 얻고 아마도 작업을 저장하는 스크립트. 자동화는/작업이 인간의 오류를 줄일 수 있고 감소 할 수 있으며 좋은 일이 될 수 있습니다. 또한 칩을 자주 전환하거나 칩 패밀리에서 작동하는 코드 하나를 작성하려고하는 경우이 자동화를 원할 수도 있습니다. .

결론은 예입니다. 모든 팔 작업에 대해 하나의 링커 스크립트로 만 살 수 있습니다. 그러나 작업을 해당 대본에 맞게 조정해야합니다. 모든 예제 코드와 함께 작동하는 스크립트 하나를 찾지 못할 것입니다. 대본이 복잡할수록 차용하기가 더 어려워집니다. 그렇습니다. 위의 스크립트는 LD 명령 줄에서 수행 될 수 있지만 (GCC 2.95) 위의 최소 스크립트를 개발할 수 없었고 그 이후로 사용해 왔을 때 다시 돌아올 수 있습니다. 어떤 이유로 든 두 번째 스크립트를 수정해야했지만 4.xx를 사용하면 확실히 4.4.x를 사용할 수 있습니다.

다른 팁

가 아닌 보편적인 linker script.이러한 스크립트를 매우 중요한 이후 그들은 정의는 어디에서 메모리(RAM 또는 ROM)다양한 데이터 및 프로그램 섹션에 배치됩니다.뭔가에 해당하는 IAR 컴파일러(xcl 파일 경우).당신이 명백하게만 사용되는 기본 지금까지.

가 문서에 대해 STR7xx 사용"이라는 오픈 소스를 위한 도구 STR7xx Cross 개발".을 찾을 수 있습의 링크 yagarto 홈페이지에 있습니다.나는 당신이 그것을 살펴보기와 방법을 이해하려고 노력하는 파일을 링커 작동합니다.거기에는 또한 몇 가지 다른 구성할 파일에 대한 이해를 갖습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top