Hallo Forum,
komm gerade mit google nicht weiter... irgendwie fehlen mir die
Stichwörter... daher muss ich mal hier fragen.
Mein AVR (XMega) Programm ist nun schon recht groß (> 64 kB), Tendenz
steigend... Ich hab ein paar Variablen im Flash, als PROGMEM... ab 64kB
sollte man ja die Progmem Funktionen mit _far aufrufen. Dazu muss noch
ein ASM Makro einen 32 Bit Pointer generieren. Das alles, sieht mir
recht langwierig aus... :(
Da es mir darum geht, das möglichst schnell abzuarbeiten, würde ich gern
die Variablen IMMER in die ersten 64 kB packen lassen und lieber das
Programm (hat größten Anteil) in die hinteren Regionen verbannen.
Da ja in den Programmen meist relative Sprünge gemacht werden, sollte
das ja nicht alles ausbremsen?!
Sind meine Vermutungen richtig? Wo liegen die Flashvariablen für
gewöhnlich? Kann ich mir mit AVR Studio eine bessere Übersicht
verschaffen oder eine Warnung ausgeben lassen, wenn Variablen mit _far
aufgerufen werden müssen?
Danke
Basti
Ich bin verwirrt. Variablen liegen nicht im Programmspeicher, sondern im
RAM. Das RAM ist nicht größer als 64KB.
Im Programmspeicher können nur Konstanten liegen. Sie werden in der
Regel automatisch VOR dem Programmcode abgelegt, also am Anfang des
Speichers.
Siehe
http://www.nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html
Absatz "Detailed Description".
Ja, ich meine constante variablen im Flash... (klingt zwar nach
Widerspruch, is aber so)...
Ja ist schon die richtige Seite... und da steht:
>If possible, put your constant tables in the lower 64 KB
Ja gern, aber wie? :-/
Basti schrieb:>>If possible, put your constant tables in the lower 64 KB>> Ja gern, aber wie? :-/
Hättest du mal weitergelesen:
This is normally not a big concern as the linker setup arranges any
program space constants declared using the macros from this header file
so they are placed right after the interrupt vectors, and in front of
any executable code.
Ich hab schon gelesen... nur normalerweise und hätte, könnte, wäre, ist
nicht das was ich suche... Zumal die Beschreibung zu Zeiten von nicht
XMega entspannt, ist mir das etwas zu schwammig (ja da ist auch schon
XMega Erweiterungen erwähnt)... nicht das ich demnächst auf komische
Probleme stoße und mich mehrere Tage darüber wundern muss... hätte das
gern vorher abgeklärt...
Hat jemand weiterführende Links über dieses "Linker Setup?"
Danke, Basti
Basti schrieb:> Ich hab schon gelesen... nur normalerweise und hätte, könnte, wäre, ist> nicht das was ich suche...
Wenn du noch weiter liest, findest du auch die Begründung, warum es
nur "normalerweise" und nicht "immer" geht:
However, it can become a problem if there are too many of these
constants, or for bootloaders on devices with more than 64 KB of ROM.
Ist ja auch völlig logisch. Wenn du mehr als 64kB an Konstanten hast,
passen sie nicht komplett in die unteren 64kB. Da kann dann aber auch
keine Linker-Einstellung dagegen helfen.
@Basti,
also der Linker lässt sich schon irgendwie anweisen etwas an eine
bestimmte Stelle in Speicher zu packen - siehe Bootloader. Frag mich
jetzt nicht wie - C ist nicht meine Baustelle.
Man kann die Variablen an den Anfang legen - sicher. Wenn das Programm
jedoch in die nächste Page reicht wird dort der Code bei Sprüngen über
die Grenze länger/langsamer wenn die Sprungdistanz der rel. nicht
reicht, und wie der Compiler den Code so zusammenstellt, da hast du auch
nicht viel Einfluss. Der Pagewechsel fürs Programm findet übrigens erst
nach 128k stat, da der Speicher ja Wortweise addressiert wird.
Ich habs bei einem Xmega256 so gemacht, das ich alle Daten im Flash ab
Begin der 3. Page untergebracht habe. Da kann man den Pointer der für
den Flashzugriff (siehe ASM Makro) die Page addressiert immer fest
stehen lassen. Wenn für das Programm 128k reichen hat man dort noch
keine Probleme.
Sascha
kopfkratz
Welchen XMega nimmst Du und hat der auch EEProm ?
Ansonsten gibt es auch noch Flash/EEProm Bausteine mit SPI oder I²C o.ä.
Den Flash könntest Du mit z.B. einem Bootloader Code zur Laufzeit ändern
...
Wenn das denn schneller wäre als das was Du erwähnt hast ...
Die Frage ist halt mal wieder wo die Glaskugel zu polieren ist ...