Forum: Mikrocontroller und Digitale Elektronik ATmega2561 - Funktionen oberhalb von 128k?


von Jens B. (kaeptnahab)


Lesenswert?

Moin Zusammen,

ich darf mich gerade mit unserem Speicherproblem rumschlagen...

Zum Tool:
Programmiert wird mit AVRstudio/Eclipse in C.

Zur Geschichte:
Dies wunderbare Projekt startet mit ATmega 128 und wurde, nachdem immer 
mehr Anforderungen dazukamen, durch den ATmega2561 abgelöst. Mittels 
"sections" haben wir schon einige Tabellen in den oberen (also oberhalb 
der mit 16 Bit adressierbaren 128k) Speicherbereich verlegt.
Jetzt kommt natürlich noch etwas dazu, aber es gibt keine Tabellen mehr 
zu verlegen!
Jetzt soll ausführbarer Code im besagten oberen Speicherbereich liegen!
Sprich: Funktionen sollen dort (in den "oberen" Speicherbereich) hin,
die auch von Funktionen im "unteren" Speicherbereich aufgerufen werden, 
usw.

Gibt es da eine verständliche Beschreibung wie ich sowas mache, 
möglichst auf Deutsch ?
Gibts da vielleicht ein Schlüsselwort oder so etwas für?
Vielleicht hat ja auch jemand Beispiele für mich....

von Jadeclaw (Gast)


Lesenswert?

Sollte der Compiler das nicht vollständig alleine handeln, wenn amn ihm 
nur den Typ korrekt angibt?

Gruß
Jadeclaw.

von waldi (Gast)


Lesenswert?

Hi,

falls Deine Frage auf den den WinAVR abzielt, dort gibt es eigentlich 
nichts besonderes zu beachten (macht der Compiler alles selbst), es sei 
denn Du nutzt Funktionspointer zum Aufruf von Funktionen oberhalb 128kB. 
Dazu gibts dann hier im Forum auch schon einiges an Themen ...

Gruss

von Jens B. (kaeptnahab)


Lesenswert?

Hi,

soweit ich bis jetzt gelesen und verstanden habe, regelts der Compiler 
schon selber, aber wohl nicht für einige bestimmte lib-Funktionen. (mit 
prologue.../epilogue...) Diese soll man in den Bereich unter 128k 
anordnen.
Wenn ich zB die Optimierung für eine Datei abschalte, bekomme ich 
"warning: internal error: out of range error" für lib-Funktionen (zB 
sprintf/vsprintf).
Das nächste Experiment soll sein, diese Funktionen/Files aus der lib in 
den Bereich unterhalb 128k anzuordnen.
Mir ist aber noch nicht so klar, wie ich das anstellen soll.
AVRstudio oder Makefile sollten die Ansatzpunkte sein...
Für eigene Daten habe ich sections im oberen Bereich angelegt, auf die 
ich mit pgm_read_xxx_far(...) zugreife und den Sectionnamen bei der 
Anlage der Daten zuweise.
Wie das aber bei lib-Funktionen funktionieren soll?!?
Das Thema ist wohl noch aktuell, da gibts aus dem März nen alten Thread, 
der besagt, das es mit der 2010er winAVR auch nicht klappt...
Der von mir derzeit bevorzugte Ansatz ist etwa in der Mitte zu finden.
[[Beitrag "WinAVR Bug: Crash wegen Codegrösse"]]

von Jens B. (kaeptnahab)


Lesenswert?

Moin Zusammen,

so, was mir weitergeholfen hat:
Die Linkeroption "-Wl,--relax"
Dann funzt es mit den Trampolinen wohl besser,
also den Sprungfunktionen zu den eigentlichen Funktionen
im höheren Speicherbereich.
Damit bin ich jetzt bei ca. 53,x%, ca. 140000bytes,
wo ich dann an die erste section für Texte stosse,
aber die kann ich noch verschieben, falls nötig.
Also mal mit der Linkeroption oben versuchen, bevor man
aufwendig weitersucht....

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.