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?

¿Fue útil?

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?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top