2010-10-13 3 views
5

Ist es möglich, ein Array zu erstellen, das 256-Byte-Grenze nicht überschreitet? Das heißt, die Adressen der einzelnen Array-Objekte unterscheiden sich nur im unteren Byte. Dies ist eine schwächere Anforderung als das Array auf 256 Bytes ausgerichtet zu halten. Die einzige Lösung, die ich mir vorstellen konnte, war die Ausrichtung auf next_power_of_two(sizeof(array)), aber ich bin mir nicht sicher über die Lücken, die auf diese Weise erscheinen würden.Array überschreitet 256-Byte-Grenze nicht

Es ist für eine Bibliothek für AVR-Mikrocontroller, und das würde mir ein paar wertvolle Anweisungen in einem Interrupt-Handler sparen. Das Array, das diese Eigenschaft haben sollte 54 Byte lang von etwa 80 Bytes der gesamten statischen Speicher von der verwendet Bibliothek. Ich suche nach einem Weg, der die Speicheranforderungen nicht erhöht.

Ich benutze avr-als gnu Assembler und avr-ld Linker.

Beispiel: Wenn das Array an der Adresse 0x00f0 beginnt, ändert sich das höhere Wort von 0x00 nach 0x01, während es das Array durchläuft.

Ich interessiere mich nicht wirklich, ob es bei Adresse 0x0100 oder 0x0101 beginnt, solange es die Grenze nicht überschreitet.

+0

Sie müssen die Adresse des Arrays ausgerichtet halten? Wie verringert das die Anzahl der Instruktionen, da Sie bereits wissen, dass das Array <= 256 Elemente ist? – MSN

+0

Ich muss es nicht ausgerichtet halten. Siehe das Beispiel, das ich hinzugefügt habe. – cube

+1

Beachten Sie jedoch, dass das Halten des Arrays, das auf eine ** 64 ** -Byte-Grenze ausgerichtet ist, Ihren Anforderungen entspricht - Ihr Linker * sollte * in der Lage sein, diese Zuordnungen zu sortieren, damit Sie keinen verschwendeten Speicher erhalten. –

Antwort

1

Sie benötigen nur 64-Byte-Ausrichtung, um diese Anforderung zu erfüllen, z. dies sollte funktionieren:

uint8_t a[54] __attribute__ ((aligned(64))); 
+1

Das könnte den Speicherbedarf erhöhen, weil ich nicht glaube, dass der Linker schlau genug ist, um .bss-Einträge in Conserver-Speicher umzuordnen. –

0

Ich weiß nichts über AVR-Mikrocontroller nicht, aber im Allgemeinen sind statische Variablen in der Regel im Datenteil der ausführbaren Datei platziert, und da Ihre statischen Speicheranforderungen niedrig sind, alle Sie müssen sicherstellen, dass der Datenabschnitt 256 Byte ausgerichtet ist. (Dies kann standardmäßig sein. Auf x86 ist es normalerweise.) Überprüfen Sie die Linker-Optionen ...

+1

Und was passiert, wenn anderer Code, der mit meiner Bibliothek verknüpft ist, mehr statischen Speicher zuweist? Alles geht an .bss und mein kleines Array wird irgendwo in der ganzen Sektion verschoben, oder? – cube

+0

Was Sie tun könnten, ist es in einen eigenen Abschnitt zu setzen und die Ausrichtung im speziellen Abschnitt in der Linker-Befehlsdatei sicherzustellen. Aber wahrscheinlich lohnt es sich nur, wenn Sie es zum Speichern von Speicher optimieren müssen. –

Verwandte Themen