Pergunta

Eu estou tentando ARM programa usando Eclipse CDT + + Yagarto (Conjunto de ferramentas GNU) + OpenOCD. Em vários projetos de amostra (a partir do site Yagarto por exemplo) eu encontrei scripts de vinculador (* .ld), onde um monte de informações que liga especificado (juntamente com definições seções). Na verdade eu não ter enfrentado este arquivos antes (não IAR não precisa deles), e eu encontrá-los um pouco difícil de entender a partir de uma primeira vista. Então, minha pergunta é que eu posso usar um único tal arquivo de script para o meu processador alvo (STR710FZ2T6) com todos os meus projetos ou eu tenho que começar familiar ao escrever este roteiros e escrevê-los para cada projeto. Se eu posso usar um único arquivo para todos os projetos para determinado processador alvo que você pode agradar conselho onde posso encontrar tal um universal.

Foi útil?

Solução

Meu palpite é cada terceira pessoa tem um script ou solução diferente. Há uma série de problemas que têm de ser resolvidos, ligantes diferentes vão resolver aqueles de diferentes maneiras. Acho GNU tornou muito difícil, se não magia negra.

Para um sistema embarcado que são muitas vezes vai ter um flash ou EEPROM ou alguma outra forma de memória apenas para leitura para arrancar a partir. Como outros processadores da ARM tem uma tabela de vetores para contá-la essencialmente onde o código de reset é e de interrupção, etc. Assim que a tabela tem que ser em um lugar específico e você tem que dizer o vinculador para colocá-lo naquele lugar específico (primeiro) .

Um dos roteiros que eu gosto de usar é:

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

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

Eu costumo usar RAM e ROM como nomes em vez de Bob e Joe mas demonstrando aqui que ele não importa o que os nomes são eles são apenas rótulos.

Outra variação sobre o tema:

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

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

A primeira permite que você coloque os arquivos na linha de comando vinculador em qualquer ordem, mas você tem que ter tabela de vector no arquivo startup.o. Este último permite que você use quaisquer nomes, mas o primeiro arquivo sobre as necessidades de script vinculador ter tabela de vetor.

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

Ou com ld diretamente

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

O RX informa o vinculador para colocar ler e executar coisas nessa seção memória e o lamento é basicamente tudo o resto. Se você tiver apenas um carneiro, por exemplo, você pode colocar toda a RXWAIL bandeiras na linha que diz onde o carneiro é. Dependendo do seu carregador, nesse caso, você pode contar com o arquivo elf dizendo o carregador onde a filial para começar ou você pode simplesmente fazer o ponto de entrada no início do binário e o carregador pode ser mais simples. Os braços (não o Cortex-M3) têm uma instrução de desvio como o primeiro vetor para o vetor de reset para que possa apenas fingir para construir uma tabela de vetores de qualquer maneira para uma solução de RAM e vai funcionar.

A uma série de problemas com esta solução que não faça acontecer a me incomodar. I inicializar variáveis ??no meu código, e não durante a declaração.

Este

int rx;

int main ( void )
{
  rx = 7;

em vez de

int rx=7;

int main ( void )
{

Eu também nunca assumir que uma variável é zero quando o código começa Eu sempre inicializar-lo para algo antes de eu começar. O seu código de inicialização mais script de vinculador como uma equipe pode trabalhar em conjunto para tornar mais fácil para automatizar a redefinição do código BSS e copiar dados de inicialização diferentes de zero de rom para a RAM durante a inicialização. (Que int rx = 7;. Acima requer algum código que copia o valor 7 de algum lugar rom e escreve-lo para o local de memória na RAM alocada para a variável rx de modo que quando main () começa a 7 está lá

Meu código de inicialização também é bastante simples como resultado deste método:

.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

Você vai ver ou ler sobre as soluções que permitem que o código de inicialização eo script vinculador para trabalhar em conjunto para não ter de ponteiros pilha codificar, espaço de pilha, coisas assim, mais uma vez você pode colocar um monte de trabalho para o arranque complicado códigos e scripts vinculador para ganhar alguma automação e talvez salvar algum trabalho, talvez não. A automatização, se / quando lata trabalhando e irá reduzir o erro humano e que pode ser uma coisa boa, também, se você está alternando chips de frequência ou tentar escrever um pouco de código que funciona em uma família de chips você pode querer essa automação bem .

A minha linha de fundo é SIM você pode viver com apenas um script de vinculador para todo o seu trabalho ARM. Mas você tem que adaptar seu trabalho para esse script. Você provavelmente não vai encontrar um script que trabalha com everyones exemplo de código. Quanto mais complicado o script o mais difícil será para emprestar. Sim, meus scripts acima pode provavelmente ser feito na linha de comando ld, mas quando caminho de volta (gcc 2.95) eu não poderia chegar a esse trabalho de modo desenvolveu o roteiro mínima acima e foram usá-los desde então. Teve que modificar para o segundo script, por algum motivo, mas com 4.x.x, certamente 4.4.x eu sou capaz de usar qualquer um.

Outras dicas

Não existe um script de vinculador universal. Esses scripts são muito importantes, uma vez que definem onde na memória (RAM ou ROM) as várias seções de dados e do programa serão colocados. Há algo equivalente em compiladores IAR (arquivos XCL se bem me lembro). Você, obviamente, só utilizado o padrão que até agora.

Existe um documento legal sobre STR7xx "Usando ferramentas de código aberto para STR7xx Cruz Desenvolvimento". Você pode encontrar um link em Yagarto homepage. Eu recomendo que você tem um olhar para ele e tentar entender como vinculador arquivos de trabalho. Existem também alguns outros arquivos de configuração que você precisa ter algum conhecimento de.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top