Frage

Ich brauche Code-Banking in ein 8051-Mikrocontroller verwenden, um alle den Code zu passen. SDCC sagt, es unterstützt, aber ich habe Probleme bei der Verknüpfung Schritt.

Ich habe ein Testprojekt mit drei Dateien: main.c, func1.c und bank.asm. Die Hauptfunktion sollte nennen func1 () und dann in einer while-Schleife sitzen. Aber func1 () ist in einer anderen Codebank.

// 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

Ich habe eine Build-Batch-Datei, alles zu kompilieren und sie alle zusammen zu verbinden.

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

Ich erhalte diese Linker-Fehler:

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

Wie erhalte ich diese zu verknüpfen?

War es hilfreich?

Lösung

Von dem SDCC Handbuch:

  

Die Segmente können überall in der platziert werden   4 meg Adreßraum unter Verwendung der üblichen   - * - loc Optionen. Beachten Sie, dass, wenn alle Segmente über 64 KB befinden, die -r   Flag muss an den Linker zu übergeben werden   erzeugen, um das richtige Segment   Verlagerungen und die Intel HEX-Ausgang   Format verwendet werden. Die -r Flag kann   an den Linker übergeben werden, die unter Verwendung   Option -Wl-r auf der SDCC-Befehlszeile.   Doch derzeit kann der Linker nicht   Griff Codesegmente> 64k.

So fügen -Wl-r an die Linker Linie.

Andere Tipps

bin ich mit SDCC nicht vertraut, sondern auch aus anderen überhöht Speicherarchitekturen, hatten wir die umgeleiteten Bankfunktionsaufrufe zur Verfügung zu stellen.

Haben Sie müssen in den richtigen Code setzen für die Einstellung der Bankregister oder was auch immer setzt die Speicherbank in der:

__sdcc_banked_call::
    ret                 ;make the call

__sdcc_banked_ret::
    ret                 ;return to caller

Routinen?

Obwohl dies wahrscheinlich nicht das Linker Problem.
Sie benötigen einen Code seg zu definieren: BANK1

Das sieht aus wie es ist, um die Codesegmente einrichten:

//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)

aber es gibt keine BANK1 definiert. Gibt es eine Linker-Datei und macht es zuweisen den gesamten Speicher / Flash-Raum zu diesen Code-Segmente?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top