Codigo bancario con SDCC
-
05-07-2019 - |
Pregunta
Necesito usar el código bancario en un microcontrolador 8051 para ajustar todo el código. SDCC dice que lo admite, pero tengo problemas en el paso de vinculación.
Tengo un proyecto de prueba con 3 archivos: main.c, func1.c y bank.asm. La función principal debe llamar a func1 () y luego sentarse en un bucle while. Pero func1 () está en un 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
Tengo un archivo por lotes de compilación para compilar todo y vincularlo todo.
sdcc -c func1.c
sdcc -c main.c
asx8051 -ol bank.asm
sdcc "-Wl -b BANK1=0x018000" main.rel func1.rel bank.rel
Recibo este error de vinculador:
?ASlink-Error-Insufficient ROM/EPROM/FLASH memory.
¿Cómo obtengo esto para enlazar?
Solución
Del manual SDCC:
Los segmentos se pueden colocar en cualquier parte del Espacio de direcciones de 4 megas usando lo habitual. - * - opciones de ubicación. Tenga en cuenta que si alguno de los segmentos se encuentra por encima de 64K, el -r La bandera debe ser pasada al enlazador para generar el segmento adecuado reubicaciones, y la salida Intel HEX Se debe utilizar el formato. La bandera -r puede ser pasado al enlazador usando el Opción -Wl-r en la línea de comando SDCC. Sin embargo, actualmente el enlazador no puede manejar segmentos de código > 64k.
Entonces, agrega -Wl-r a la línea del enlazador.
Otros consejos
No estoy familiarizado con SDCC, pero de otras arquitecturas de memoria bancarias, tuvimos que proporcionar las llamadas a funciones bancarias redirigidas.
¿Necesita ingresar el código correcto para configurar los registros bancarios o lo que sea que haya configurado el banco de memoria en:
__sdcc_banked_call::
ret ;make the call
__sdcc_banked_ret::
ret ;return to caller
rutinas?
Aunque probablemente este no sea el problema del vinculador.
¿Necesita definir un código seg para: BANK1?
Parece que está configurando los 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)
pero no hay BANK1 definido. ¿Hay un archivo enlazador, y asigna toda la memoria / espacio flash a estos segmentos de código?