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