Forum: Mikrocontroller und Digitale Elektronik AVR 8 Bit, Flash > 64kb


von Basti (Gast)


Lesenswert?

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

von Stefan (Gast)


Lesenswert?

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".

von Basti (Gast)


Lesenswert?

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? :-/

von Rolf Magnus (Gast)


Lesenswert?

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.

von Basti (Gast)


Lesenswert?

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

von Rolf Magnus (Gast)


Lesenswert?

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.

von Sascha W. (sascha-w)


Lesenswert?

@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

von kopfkratzer (Gast)


Lesenswert?

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 ...

von Stefan F. (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.