Banking código com SDCC
-
05-07-2019 - |
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?
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?