Hallo,
ich benutze das Simplicity Studio und einen C8051F580. Dieser hat laut
Datenblatt 96kb/128kb Speicher und mein Programmcode beträgt derzeit
71kb.
Wenn ich jedoch die 65535byte Größte überschreite sagt mir das
Simplicity Studio, dass ich einen Adress Space Overflow habe - was ich
damit deute, dass dieser denkt der µC hätte nur 65kb Speicher.
Muss ich da noch irgendwo etwas einstellen? Habe ich irgendetwas falsch
eingebunden?
Danke!
Ich vermute eher dass du nur 16bit adressieren kannst. Das sind nur
64kByte. Wenn man darüber hinausgehen möchte, dann muss man etwas noch
machen.
Ich kenne mich mit den Controller da nicht aus. Gibt es einen Hinweis
welche Section da Probleme macht? code? Da könnte sein dass du irgendwie
bestimmte Funktionen nur mit long jumps aufrufen kannst.
Bei Daten ist das auch so. Man kann nur in ein bestimmten bereich
addressieren. Darüber hinaus muss man etwas machen. Da ich mich hier
nicht so gut auskenne (ich mache eher PIC und PowerPC) weiss ich nicht
genau was du machen musst. Eber etwas richtung Long Jump oder irgendwie
Sekctionen geschickt platzieren. code ab 0x0000 bis 0xFFFF und
constanten 0x10000 bis ..... Kann sein dass man nicht mehr als 64kByte
Code haben darf. Und den Rest kann man mit konstanten auffüllen.
Ich kann unter Tool Settings > Keil 8051 Compiler > General die "Code
Size" angeben, jedoch nur folgende Auswahlmöglichkeiten:
- Large (64k program)
- Compact (2k functions, 64k program)
- Small (program 2k or less)
Ein kurzer Blick ins Datenblatt verrät, daß dort vier Speicherbänke mit
je 32 KB als Programmspeicher vorhanden sind.
Wenn Du den vollen Speicher nutzen willst, mußt Du nur die Bänke
umschalten und darfst dabei nichts verkehrt machen ;-)
Gurkenteil!
Mehr als 64k sind nur mittels Banking möglich. Du musst Deinen Code auf
die verschiedenen Banks aufteilen, und der Compiler muss wissen, dass er
Bankswitching machen muss. Momentan weiß er das offensichtlich nicht.
Siehe Datenblatt Abschnitt "12.1 Program Memory".
fchk
Jens schrieb:> mein Programmcode beträgt derzeit> 71kb.
Ich würde erstmal untersuchen, was diesen Code bloat verursacht.
Ist vielleicht das Large Model eingeschaltet oder die Optimierung
ausgeschaltet?
Vorzugsweise sollte man immer Small und Size Optimization einstellen.
In Small kann man dann größere Arrays als XDATA definieren, d.h. default
kann der Compiler den sparsamen und schnellen DATA RAM nehmen.
Es kann aber auch sein, daß der Code schlecht geplant ist und durch viel
Copy&Paste wie Kraut und Rüben aussieht. Das sollte man schleunigst
ändern, denn es rächt sich später durch Fehlerhäufung und Unwartbarkeit.
Ich muss das nochmal aufgreifen. Ich habe mir ein Testprojekt erstellt,
welches einfach zwei ca. 40k große Arrays enthält, die Probeweise den
Speicher füllen sollen. Diese sind als "code" definiert, landen also im
Flash.
Code + const sind nun ca. 90000b groß und passen somit nicht mehr in den
normalen Adressraum vom 0x0000 - 0x7fff(common) und 0x8000 -
0xffff(Bank0-3).
Ich muss also nun Code Banking betreiben, um diese irgendwie
unterzubringen.
Dafür habe ich unter Tool Settings -> Linker -> Banking das Code Banking
aktiviert und large1.obj (enthält ein großes Array) auf die Bank3
positioniert.
Das basiert auf einem Code Banking example, so dass USE_BANKING=1 und
NUMBANKS=4 bereits unter Symbols bzw. Control Symbols gesetzt sind.
Mir ahnt, dass ich dem Compiler noch irgendwas mitteilen muss, damit das
banking funktioniert. Folgenden fehler erhalte ich noch:
1
*** ERROR L107: ADDRESS SPACE OVERFLOW
2
SPACE: CONST
3
SEGMENT: ?CO?LARGE2
4
LENGTH: 00B088H
5
6
*** ERROR L120: CONTENT BELONGS TO ERRONEOUS SEGMENT
7
SEGMENT: ?CO?LARGE2
8
9
Program Size: data=11.0 xdata=0 const=90384 code=241
10
LX51 RUN COMPLETE. 0 WARNING(S), 2 ERROR(S)
11
make: *** [F58x-59x_Blinky_Banked.omf] Error 1
Hat da jemand Tips? Wenn ich nach 8051 und code banking suche gibt es
war von Keil und silabs Ergebnisse - aber ich bin zu blöd um daraus
schlau zu werden ;).
Hast du den Startup Code in dein Projekt aufgenommen? Wenn ich mich
richtig errinnere muss Banking im Startup Modul aktiviert werden. Das
geht natürlich nur wenn du ein Startup Modul ins Projekt aufgenommen
hast. Falls nicht wird ein Default Startup aus der Runtime Lib
dazugelinkt.
Thomas
Jens schrieb:> welches einfach zwei ca. 40k große Arrays enthält
Wie schon gesagt wurde, im banking Mode passen max 32kB in eine Bank.
Du kannst entweder ein 40kB Array im non banking Mode anlegen oder
mehrere Arrays je <=32kB im banking Mode.
Peter D. schrieb:> Wie schon gesagt wurde, im banking Mode passen max 32kB in eine Bank.> Du kannst entweder ein 40kB Array im non banking Mode anlegen oder> mehrere Arrays je <=32kB im banking Mode.
Ok, ich habe mal 3 x 30000b große Pakete erstellt. Wenn ich zwei
verwende funktioniert, bei 3 bin ich wieder bei 90000b und kriege einen
Fehler:
1
LX51 LINKER/LOCATER V4.66.30.0 - SN: K1FPC-D01A5Z
2
COPYRIGHT ARM Germany GmbH 1995 - 2014
3
@F58x-59x_Blinky_Banked.lnp COMMON {"./src/F580_Blinky_Banked.OBJ"},
Dein Linker Skript packt large1 und large2 nach common dadurch wird aber
mehr als 32k verbraucht. Common ist im Bankmode ja nur 32k groß. Deshalb
geht der Bankmode nicht. Du musst large 1 nach bank0 large2 nach bank1
large3 nach bank2 legen.
Thomas
Das setzt natürlich vorraus dass das Banking auf deinem Chip wirklich so
funktioniert mit 1 Common Bank und 3umschaltbaren Banks. Ich kenn die
Silabs Teile nicht im Detail.
Thomas Z. schrieb:> Options->Target
Gibt es bei mir nicht. Simplicity Studio.
Thomas Z. schrieb:> Das setzt natürlich vorraus dass das Banking auf deinem Chip wirklich so> funktioniert mit 1 Common Bank und 3umschaltbaren Banks. Ich kenn die> Silabs Teile nicht im Detail.
Steht auch so im Datenblatt. Ich habe einfach die Vermutung, dass ich
irgendwas entscheidendes vergesse..
Jens schrieb:> Thomas Z. schrieb:>> Options->Target>> Gibt es bei mir nicht. Simplicity Studio
das sind Einträge in keils uVision. Das muss es vergleichbar auch bei
Silabs geben.
Ev musst du mal im Quellcode von l51_bank.a51 forschen dort sollte der
bank Umschalt Code drin sein.
Poste mal das Mapfile (m51 File)
Wenn dein Chip 2 64k Bänke hat dann kannst du keine 3. Bank auswählen
dann gibt's Common in Bank 0 und Bank 1 jeweils mit einem large
kombiniert. Das 3. Large kann dann nicht platziert werden.
Thomas
Thomas Z. schrieb:> Wenn dein Chip 2 64k Bänke hat
C8051 hat 32 KB Speicherbänke.
Und man kann die Bank für MOVC/MOVX unabhängig von der Bank für
Instruction fetch auswählen. Strings u.ä. Daten können auf einer extra
Bank liegen ohne das man ständig switchen müsste. Was bei knapp über
64KB Code oftmals schon ausreichen könnte.
So kommt man denn auch auf 96 KB: Eine der 32KB Bänke fehlt.