Forum: Mikrocontroller und Digitale Elektronik C8051F580 65kb statt 96kb? Simplicity Studio


von Jens (Gast)


Lesenswert?

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!

von kyrk.5 (Gast)


Lesenswert?

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.

von Jens (Gast)


Lesenswert?

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)

von m.n. (Gast)


Lesenswert?

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!

von Frank K. (fchk)


Lesenswert?

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

von Jens (Gast)


Lesenswert?

Danke, schaue ich mir mal an!

von Lothar (Gast)


Lesenswert?

C51: CREATING CODE BANKING PROGRAMS

http://www.keil.com/support/docs/158.htm

von Peter D. (peda)


Lesenswert?

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.

von ... (Gast)


Lesenswert?

Sehr lesenswert:

"THE FINAL WORD ON THE 8051"

von Peter D. (peda)


Lesenswert?

... schrieb:
> Sehr lesenswert:
>
> "THE FINAL WORD ON THE 8051"

Welches denn?
Da gibt es einige von verschiedenen Autoren.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Und ich bin mir sicher, dass das "finalste" Wort noch immer nicht 
gesprochen ist...

von m.n. (Gast)


Lesenswert?

Was Du meinst heißt "linearer Adressraum". Damit kann man selbst bei 
Tiefschlaf nicht von der Bank fallen ;-)

von Jens (Gast)


Lesenswert?

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 ;).

von Thomas Z. (usbman)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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.

von Jens (Gast)


Lesenswert?

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"},
4
COMMON {"./src/F580_Blinky_Init.OBJ"},
5
COMMON {"./src/L51_BANK.OBJ"},
6
COMMON {"./src/SILABS_STARTUP.OBJ"},
7
COMMON {"./src/large1.OBJ"},
8
COMMON {"./src/large2.OBJ"},
9
BANK3 {"./src/large3.OBJ"}
10
TO "F58X-59X_BLINKY_BANKED.OMF.CRBUILD" REMOVEUNUSED PRINT(.\F58x-59x_Blinky_Banked.m51) PAGEWIDTH (120) PAGELENGTH (65) BankArea(0x8000,0xffff) CLASSES( ECODE(C:0x0 - C:0x1fbfe), HCONST(C:0x0 - C:0x1fbfe), XDATA(X:0x0 - X:0x1fff), HDATA(X:0x0 - X:0x1fff))
11
12
*** ERROR L107: ADDRESS SPACE OVERFLOW
13
    SPACE:   CONST
14
    SEGMENT: ?CO?LARGE3
15
    LENGTH:  0075B0H   
16
17
*** ERROR L120: CONTENT BELONGS TO ERRONEOUS SEGMENT
18
    SEGMENT: ?CO?LARGE3
19
20
Program Size: data=11.0 xdata=0 const=90384 code=251
21
LX51 RUN COMPLETE.  0 WARNING(S),  2 ERROR(S)
22
make: *** [F58x-59x_Blinky_Banked.omf] Error 1

von Thomas Z. (usbman)


Lesenswert?

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

von Jens (Gast)


Lesenswert?

Thomas Z. schrieb:
> Du musst large 1 nach bank0 large2 nach bank1
> large3 nach bank2 legen.

Geht leider auch nicht:
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"},
4
COMMON {"./src/F580_Blinky_Init.OBJ"},
5
COMMON {"./src/L51_BANK.OBJ"},
6
COMMON {"./src/SILABS_STARTUP.OBJ"},
7
BANK1 {"./src/large1.OBJ"},
8
BANK2 {"./src/large2.OBJ"},
9
BANK3 {"./src/large3.OBJ"}
10
TO "F58X-59X_BLINKY_BANKED.OMF.CRBUILD" REMOVEUNUSED PRINT(.\F58x-59x_Blinky_Banked.m51) PAGEWIDTH (120) PAGELENGTH (65) BankArea(0x8000,0xffff) CLASSES( ECODE(C:0x0 - C:0x1fbfe), HCONST(C:0x0 - C:0x1fbfe), XDATA(X:0x0 - X:0x1fff), HDATA(X:0x0 - X:0x1fff))
11
12
*** ERROR L107: ADDRESS SPACE OVERFLOW
13
    SPACE:   CONST
14
    SEGMENT: ?CO?LARGE3
15
    LENGTH:  0075B0H   
16
17
*** ERROR L120: CONTENT BELONGS TO ERRONEOUS SEGMENT
18
    SEGMENT: ?CO?LARGE3
19
20
Program Size: data=11.0 xdata=0 const=90384 code=251
21
LX51 RUN COMPLETE.  0 WARNING(S),  2 ERROR(S)
22
make: *** [F58x-59x_Blinky_Banked.omf] Error 1

von Thomas Z. (usbman)


Lesenswert?

Haken bei Codebanking unter Options->Target gesetzt?
3 Banks 0x8000-0xFFFF ?
Thomas

von Thomas Z. (usbman)


Lesenswert?

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.

von Jens (Gast)


Lesenswert?

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

von Thomas Z. (usbman)


Lesenswert?

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

von Jim M. (turboj)


Lesenswert?

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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.