Forum: Mikrocontroller und Digitale Elektronik C18 Compiler speicheradresse manuell festlegen


von David (Gast)


Lesenswert?

Hallo

Ich habe ein Pic Programm, bei dem ich zwei 256 Byte grosse Arrays habe. 
Sobald ich das Programm compilieren möchte kommt bei mir folgende 
Fehlermeldung:

Error - section '.udata_LCD.o' can not fit the section. Section 
'.udata_LCD.o' length=0x00000200
Errors    : 1

Der Fehler kommt, weil die Arrays zu gross sind(wenn die Arrays kleiner 
sind geht es), obwohl der Pic knapp 4Kbyte speicher hat (Pic 18f4620) 
und ich sonst nicht viel Speicher brauche.

Nun möchte ich mal versuchen ob es geht, wenn ich die Speicher adressen 
der Arrays manuell vergebe.
Der Pic hat im RAM 15 Banken, mit je 256 Byte speicher. Wenn ich es 
jetzt irgendwie hinbekomme, dass z.B.Bank10 für Array1 ist und Bank11 
für Array2 ist, könnte es vielleicht gehen. Da das Problem 
wahrscheinlich daran liegt, dass der Pic innerhalb von einem Array die 
Bank nicht umschalten kann und der Compiler zu blöde ist das Array in 
eine Eigene Bank zu speichern.

Weiss jemand, wie ich mit dem C18 Compiler Speicheradressen von 
Variablen manuell festlegen kann?

liebe Grüsse
David

von (prx) A. K. (prx)


Lesenswert?

Probiers mal mit "far ... array[256]" oder der Compiler-Option, Daten 
nicht implizit als "near" ins kleine Access-RAM zu stopfen. Letzteres 
dürfte freilich deutlich mehr Code zur Folge haben, weil er dann alle 
Daten banked, nicht nur die Arrays.

von David (Gast)


Lesenswert?

"far ... array[256]" hat nichts gebracht. Die Compiler-Option war schon 
auf Large Data modell(all Ram Banks). Hat beides nichts gebracht.

Beitrag "globale Variable in mehreren C-Files"

Hier steht etwas wie man mit dem C30 Compiler die Adresse von  Variablen 
festlegen kann. Eigentlich suche ich so etwas für den C18. Die Methode 
wie dort beschrieben wird funktioniert beim C18 nicht.

von Frank K. (fchk)


Lesenswert?

David schrieb:

> Weiss jemand, wie ich mit dem C18 Compiler Speicheradressen von
> Variablen manuell festlegen kann?

Ja. Dein Compiler-Handbuch. Das befindet im "doc" Unterversichnis des 
C18 Installationsverzeichnisses und heißt hlpC18ug.chm. Da darfst Du 
ruhig reinschauen, das kostet nichts extra.

Da gehst Du dann auf "Suchen, tippst "Locating Data" ein, und wählst als 
Thema "Locating Data". Da steht dann genau, wie es geht.

fchk

von David (Gast)


Lesenswert?

Frank K. schrieb:
> Ja. Dein Compiler-Handbuch. Das befindet im "doc" Unterversichnis des
>
> C18 Installationsverzeichnisses und heißt hlpC18ug.chm. Da darfst Du
>
> ruhig reinschauen, das kostet nichts extra.
>
>
>
> Da gehst Du dann auf "Suchen, tippst "Locating Data" ein, und wählst als
>
> Thema "Locating Data". Da steht dann genau, wie es geht.

Cool Danke für die Hilfe

von Alex X. (behindi)


Lesenswert?

David schrieb:
> "far ... array[256]" hat nichts gebracht. Die Compiler-Option war schon
> auf Large Data modell(all Ram Banks). Hat beides nichts gebracht.


Hallo ich hab auch das gleiche Problem:(
dass ich ein Array mit 256 Komponennten brauche aber der Compiler die 
selbe Fehlermeldung bringt,

wäre super wenn mir jemand sagen könnte wie/ wo ich die Einstellung
 Large Data modell einstellen kann

danke im Voraus für jede Hilfe

mgf
Alex

von Bernhard S. (b_spitzer)


Lesenswert?

Wie groß ist jede einzelne Variable? Byte, Int, Long, Float?? Ich kenne 
den Compiler und Controller nicht, aber eventuell kann er ein Array nur 
am Stück in eine Bank packen. Mit int Array[256] braucht er 512 Bytes, 
also mehr als eine Bank...
Versuche mal das Array so lange zu verkleinern, bis es nicht mehr 
knallt.
Bei welcher Größe ist das erreicht?

von Elko4 (Gast)


Lesenswert?

Hallo zusammen,

Der folgende Link könnte vielleicht hilfreich sein:

http://www.xargs.com/pic/c18large.html

von Bernhard S. (b_spitzer)


Lesenswert?

Der Teil davon noch mehr:
http://www.xargs.com/pic/c18-sections.html

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.