Forum: Compiler & IDEs Daten im Flash: Alignment und Position


von Detlev T. (detlevt)


Lesenswert?

Hallo GCC-Experten,

ich denke über ein Projekt mit dem MEGA1284p nach, der eine TV-Ausgabe 
haben soll wie hier: Beitrag "AVR Videogenerator, 40x25 Zeichen, nur 60% CPU Auslastung !"

Als eingefleischter (GC)C-Programmierer, der Assembler nur in größter 
Not einsetzt, habe ich da aber ein Problem. Die Daten für die Definition 
der Zeichensätze im Flash müssen ab einer Adresse modulo 256 abgelegt 
werden. Außerdem sollte diese möglichst im Bereich bis 0xFFFF sein, 
damit ich mit einem simplen LPM da heran komme.

Auch wenn ich den Stein in erster Linie wegen des üppigen SRAM 
ausgewählt habe, möchte ich mir möglichst die Option offen halten, mehr 
als 64k Flash zu nutzen. Das heißt, sowohl vor als auch hinter den Daten 
müsst der Linker Programmcode ablegen können.

Den Linker von GCC müsste ich also irgendwie dazu bekommen, das zu tun, 
was ich will.

1.) Gibt es eine elegante Methode, Daten im Flash so zu positionieren? 
(z.B. irgendwelche Attribute?)
Falls Nein:
2.) Gibt es zumindest eine funktionierende Methode? Also z.B. eine feste 
Adresse vorgeben und der Linker packt den Rest darum herum, auch wenn es 
vielleicht Lücken gibt. Oder mag der Linker es gar nicht, wenn man 
derartig in seine Handlungsfreiheit eingreift?

Vielleicht wisst ihr auch irgendeinen Trick.

Vielen Dank schon einmal für eure Mühe.

Gruß, DetlevT

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Detlev T. schrieb:

> Den Linker von GCC müsste ich also irgendwie dazu bekommen, das zu tun,
> was ich will.

http://sourceware.org/binutils/docs-2.20/ld/Scripts.html#Scripts

> 1.) Gibt es eine elegante Methode, Daten im Flash so zu positionieren?
> (z.B. irgendwelche Attribute?)

Evtl.

http://gcc.gnu.org/onlinedocs/gcc/Variable-Attributes.html#Variable-Attributes

mit aligned, wobei das Verschnitt gibt und du der Ort nicht weisst. Auf 
Anhieb kann ich auch nicht sagen, bis zu welcher Größe das für AVR geht.

> Falls Nein:
> 2.) Gibt es zumindest eine funktionierende Methode? Also z.B. eine feste
> Adresse vorgeben und der Linker packt den Rest darum herum, auch wenn es
> vielleicht Lücken gibt. Oder mag der Linker es gar nicht, wenn man
> derartig in seine Handlungsfreiheit eingreift?

http://sourceware.org/binutils/docs-2.20/ld/Scripts.html#Scripts

Löcher in Sections geht nicht. Du wirst also sehr wahrscheinlich 
Verschnitt haben.

Übliche Vorgehensweise ist das Ding in eine eigene Section zu legen und 
Section per Linkerskript dort hinzulegen, wo sie sein soll (mit 
Alignment). ABer Vorsicht bei sich überschneidenden Sections!

Das brauch dann Attribut Section bei der Definition. Ohne Eingriff in 
die Quelle geht's auch, zB in ein eigenes Object machen und das Object 
entsprechend lokatieren.

von Andreas F. (aferber)


Lesenswert?

Wenn du mit bis zu 255 Bytes (worst case) Verschnitt leben kannst, ist 
das ganz einfach:
1
uint8_t fontdata[256] PROGMEM __attribute__((aligned(256))) = { 0 };

Das Default-Linkerscript ist so aufgebaut, dass PROGMEM-Daten immer 
direkt nach den Interruptvektoren folgen. Es steht sogar ein Kommentar 
im Script drin, dass das eben genau dazu da ist, dass die Daten immer in 
den ersten 64K landen ;-) Also brauchst du dich nur noch um das 
Alignment zu kümmern, was das Attribut oben erledigt.

Andreas

von Detlev T. (detlevt)


Lesenswert?

Hallo Andreas,

das ist genau die Info, die ich gesucht habe. Bei 128k Flash könnte ich 
diesen "Verlust" sicher verschmerzen. :D

Danke, DetlevT

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.