www.mikrocontroller.net

Forum: Compiler & IDEs avr-gcc: Array an 256 Byte ausrichten?


Autor: Sebastian B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

der Betreff sagt's eigentlich schon. Kann ich ein Array in C mit einem 
Alignment von 256 Byte anlegen (im Flash)? Alle Alignments groesser 8 
Byte scheint der Compiler zu ignorieren.

in Assembler gehts ganz einfach mit
 .p2alignw 8, 0 

Danke,
Sebastian

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sebastian B. schrieb:
> Moin,
>
> der Betreff sagt's eigentlich schon. Kann ich ein Array in C mit einem
> Alignment von 256 Byte anlegen (im Flash)? Alle Alignments groesser 8
> Byte scheint der Compiler zu ignorieren.

Ja, avr-gcc definiert BIGGEST_ALIGNMENT als 8.

> in Assembler gehts ganz einfach mit
>
>
 .p2alignw 8, 0 

Du könntest es in eine eigene Section legen und per Linker-Script die 
Section passend alignen.

Alternativ funktioniert vielleicht auch
asm (".section  .progmem.data,\"a\",@progbits");
asm (".align 8");

auf oberster C-Ebene, direkt vor der Definition des Arrays. Dazu dann 
aber -fno-toplevel-reorder angeben, damit das asm vor der Definition 
verbleibt.

Johann

Autor: Sebastian B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

ich hab mir jetzt mal testweise fuer das Array ne neue Section angelegt:
const uint8_t font[8*256] __attribute__ ((section (".bigalign"))) = 
{
...
};

und das ganze per Linker-Flag an eine feste Position gelegt (das 
rumdoktoren am Linker-Script wuerde ich mir gerne ersparen):
LDFLAGS +=  [...] -Wl,--section-start=.bigalign=0x2000

Im Map File steht nun das am Ende:
.bigalign       0x00002000      0x800
 .bigalign      0x00002000      0x800 font.o
                0x00002000                font

Ich hab's noch nicht weiter ausprobiert, aber schaut soweit doch erstmal 
gut aus?

Sebastian

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sebastian B. schrieb:

> Ich hab's noch nicht weiter ausprobiert, aber schaut soweit doch erstmal
> gut aus?

Funktioniert (IMO) aber nur so lange, wie der restliche Flashinhalt 
unter der Adresse bleibt, ansonsten gibt es einen "Section 
Overlapping"-Fehler. Der Linker legt das text-Segment nicht um deine 
Section "drumherum".

Autor: Sebastian B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Funktioniert (IMO) aber nur so lange, wie der restliche Flashinhalt
> unter der Adresse bleibt, ansonsten gibt es einen "Section
> Overlapping"-Fehler. Der Linker legt das text-Segment nicht um deine
> Section "drumherum".

Ist bei mir aber kein Problem weil ich in dem 64kB Flash <10kB Programm 
drinhabe (brauche den dicken Controller nur wegen des SRAM).

Das ganze ist jetzt getestet und laeuft. Ich finde es zwar noch nicht 
besonders elegant, werds aber erstmal so lassen :-)

Sebastian

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.