Gast
#6239508
Hallo Experten, ich möchte für ein Projekt eine große Anzahl an Daten (50 kByte Audiosamples) im Flashspeicher eines AVRs ablegen. Wie ich feststellen musste, unterstützt der AVR-GCC jedoch nur Arrays bis zu einer Größe von 32768 Bytes, da die Zeigerberechnung des Compilers mit vorzeichenbehafteter 16-Bit-Arithmetik durchgeführt wird und somit nicht der gesamte 16-Bit-Adressraum verfügbar ist. Da ich den Zugriff auf die Daten im Flashspeicher und dessen Berechnung aufgrund von Geschwindigkeitsoptimierung jedoch nicht in C mittels pgm_read_byte() durchführe, sondern proprietär durch inline-Assembler umgesetzt habe, spielt die GCC-Zeigerberechnung soweit keine Rolle. Mein erster Ansatz war natürlich einfach zwei Arrays anzulegen und zu hoffen, dass der Linker beide Arrays nahtlos im Speicher platziert. Die Betrachtung der erstellen map- und lss-Datei ergab, dass beide Arrays tatsächlich hintereinander platziert werden, allerdings entspricht die Reihenfolge nicht jener der Deklaration. Welche Reihung der Linker hier vornimmt, konnte ich nicht feststellen. Auch wurden teils Füllbytes eingefügt, sodass kein Nahtloser Übergang gewährleistet ist. Alles in allem eine unzureichende und vor allem unsichere Lösung. Eine Recherche brachte mich zum Attribut „session“ wodurch dem Linker mitgeteilt wird, wo die Daten des Arrays zu platzieren sind. Teilt man nun jedem Teilarray eine eigene Session zu, sollte der Linker die Daten in gewünschter Reihenfolge platzieren. Da man dafür aber das Linkerskript für jede verwendete AVR-Familie ändern muss (neue Sessions hinzufügen), überzeugt mich diese Methode auch nicht unbedingt. Ein dritter Ansatz war, die Daten direkt als Assembler-Array (.s Datei mit .byte-Anweisungen) in das Projekt einzubinden. Dies ließ sich zwar fehlerfrei kompilieren, jedoch fand ich die Daten dann nicht im Speicher. Auch ist mir nicht klar, wie dann aus dem C-Code und dem inline-Assembler auf dieses Array zugegriffen werden kann. In einem Forumsbeitrag fand ich auch eine Methode, die Rohdaten in eine Objektdatei umzuwandeln und direkt dem Linker anzugeben. Ein durchaus interessanter Ansatz, aber aufgrund der Vorübersetzung in eine Objektdatei auch nicht ganz anwendungsfreundlich. Ich möchte Euch nun gerne Fragen, welche Möglichkeit es gibt, auf einfache Weise mehr als 32kByte an zusammenhängenden Daten im Flashspeicher abzulegen? Gibt es eine direkte Methode dem Linker mitzuteilen, zwei Arrays in vorgegebener Reihenfolge im Flashspeicher zu platzieren oder ist der Ansatz die Daten in eine eigene Assemblerdatei auszulagern doch zielführend? Vielen Dank im Voraus, Roland.