Code Banking mit SDCC
-
05-07-2019 - |
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?
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?