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.
... schrieb: > Sehr lesenswert: > > "THE FINAL WORD ON THE 8051" Welches denn? Da gibt es einige von verschiedenen Autoren.
Und ich bin mir sicher, dass das "finalste" Wort noch immer nicht gesprochen ist...
Was Du meinst heißt "linearer Adressraum". Damit kann man selbst bei Tiefschlaf nicht von der Bank fallen ;-)
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"}, |
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 |
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
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 |
Haken bei Codebanking unter Options->Target gesetzt? 3 Banks 0x8000-0xFFFF ? 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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.