Pergunta

Eu preciso usar banking código em um microcontrolador 8051 para caber todo o código. SDCC diz que o suporta, mas eu estou tendo problemas na etapa de ligação.

Eu tenho um projeto de teste com 3 arquivos: main.c, func1.c e bank.asm. A função principal deve chamar func1 () e, em seguida, sentar-se em um tempo loop. Mas func1 () está em um banco de código diferente.

// main.c
int func1(void) banked;

void main()
{
    int i = func1();

    while(i)
    {
    }
}

// func1.c
#pragma codeseg BANK1

int func1(void) {
    return 99; }

//bank.asm
    .area HOME    (CODE)
    .area GSINIT0 (CODE)
    .area GSINIT1 (CODE)
    .area GSINIT2 (CODE)
    .area GSINIT3 (CODE)
    .area GSINIT4 (CODE)
    .area GSINIT5 (CODE)
    .area GSINIT  (CODE)
    .area GSFINAL (CODE)
    .area CSEG    (CODE)
    .area HOME    (CODE)

__sdcc_banked_call::
    ret             ;make the call

__sdcc_banked_ret::
    ret         ;return to caller

Eu tenho um arquivo de construção em lote para tudo compilação e vinculá-lo todos juntos.

sdcc -c func1.c
sdcc -c main.c
asx8051 -ol bank.asm
sdcc "-Wl -b BANK1=0x018000" main.rel func1.rel bank.rel

Eu recebo este erro vinculador:

?ASlink-Error-Insufficient ROM/EPROM/FLASH memory.

Como faço para chegar a este link?

Foi útil?

Solução

A partir da SDCC Manual:

Os segmentos podem ser colocados em qualquer lugar do 4 espaço de endereço meg usando o habitual - * - opções loc. Nota que, se todos os segmentos estão localizados acima de 64K, o -r bandeira deve ser passado para o vinculador gerar o segmento adequado deslocalizações e a saída Intel HEX formato deve ser utilizado. A lata flag -r ser passado para o ligante, utilizando o opção -Wl-r na linha de comando SDCC. No entanto, atualmente o vinculador não pode segmentos de código identificador> 64k.

Então, adicione -Wl-r para a linha de ligação.

Outras dicas

Eu não estou familiarizado com SDCC, mas de outras arquiteturas de memória bancados, tivemos que fornecer as chamadas de função de banco redirecionadas.

Você precisa colocar o código correto para definir os registos dos bancos ou o que nunca define o banco de memória no:

__sdcc_banked_call::
    ret                 ;make the call

__sdcc_banked_ret::
    ret                 ;return to caller

rotinas?

Embora este não é provavelmente a questão vinculador.
Você precisa definir uma seg código para: BANCO 1

Isto olha como ele está montando os segmentos de código:

//bank.asm
    .area HOME    (CODE)
    .area GSINIT0 (CODE)
    .area GSINIT1 (CODE)
    .area GSINIT2 (CODE)
    .area GSINIT3 (CODE)
    .area GSINIT4 (CODE)
    .area GSINIT5 (CODE)
    .area GSINIT  (CODE)
    .area GSFINAL (CODE)
    .area CSEG    (CODE)
    .area HOME    (CODE)

mas não há BANK1 definido. Existe um arquivo linker, e ele atribuir todo o espaço da memória / flash para esses segmentos de código?

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