www.mikrocontroller.net

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


Autor: Detlev T. (detlevt)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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/Script...

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

Evtl.

http://gcc.gnu.org/onlinedocs/gcc/Variable-Attribu...

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

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.

Autor: Andreas Ferber (aferber)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du mit bis zu 255 Bytes (worst case) Verschnitt leben kannst, ist 
das ganz einfach:
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

Autor: Detlev T. (detlevt)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.