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 ...
Wie groß die einzelnen Speicherbereiche sind, meldet Dir avr-size. Beispiel:
1 | > avr-size -A meinprogramm.elf |
2 | |
3 | section size addr |
4 | .text 63438 0 |
5 | .data 458 8396800 |
6 | .bss 3667 8397258 |
7 | .stab 20280 0 |
8 | .stabstr 5736 0 |
9 | Total 93579 |
text ist Programmcode. data sind Konstanten.
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.