STM32 Array mit definierter Adresse

Gast #1795724
Hallo,

Ich möchte im Flash ein 2K großes Array definieren.
Dieses Array soll auch via Schnittstelle geändert werden können.
Deshalb muss man dieses, bei einer definiereten Adresse speichern.
1
const uint8_t Daten[2048] =
2
{
3
  0x01, 0x02, .....
4
};

Im Netz finde Ich viele Beispiele für ein anderen (kostenpflichtigen) 
Kompiler:
1
const uint8_t Daten[2048] __attribute__((at 0x08010000)) =
2
{
3
  0x01, 0x02, .....
4
};

Diese deklaration funktioniert bei meinem Kompiler leider nicht.
Ich benutze Ride7, dieser benutzt glaubig den GCC-Compiler.

Weiß jemand wie man das beim Ride7 deklarieren kann?
Gast #1795777
Ich habe keine Erfahrungen mit den Linker Skripten.
Wie macht man das, wenn das Array z.B. bei der Adresse 0x08010000
gespeichert werden soll?
Gast #1795910
@ Matthias K.
Das Problem dabei ist, dass bei dem Mikrocontroller den ich verwende 
(STM32F103C6T6) immer nur 2K Blöcke im Flash-Speicher geändert werden 
können.
Und wenn Ich den Linker die Adresse bestimmen lasse, dann packt dieser 
das Array nicht unbedinngt am Anfang des Blocks.

@ narf
Üher die USB-Schnittstelle
Gast #1795929
Damit keine misverständnisse aufkommen.
Es gibt keine Probleme an die Adresse des Arrays zu kommen.

Wenn man den Flash-Speicher, worin sich das Array und der 
Rest-Programm-Code befindet ändern möchte.
Muss man zuerst den 2K Block(oder auch 2K Seite) komplett löschen.
Wenn sich jetzt das Array nicht am Anfang des Blocks befindet, dann 
befindet sich dort möglicherweise Programm-Code. Dieser würde dann 
mitgelöscht.

Und das ist dann ein Problem.
#1795943
narf schrieb:
> Und wenn Ich den Linker die Adresse bestimmen lasse, dann packt dieser
> das Array nicht unbedinngt am Anfang des Blocks.

Du willst also nur genau eine Flash-Page für das Array opfern und nicht 
max. 2. Da bleibt vermutlich nur die Vorgehensweise im 2. Beitrag mit 
Sektion und Linker.

Oder Du machst die Erstinitialisierung des Array mit Deinem 
USB-Programm. Das muss das Array ohnehin an eine feste Adresse/Page 
bringen. Mit der STM FLASH Libroutine kein Problem.
Dann kannst Du im eigentlichen Programm einen Zeiger verwenden, da Du 
die Adresse weist.
Moderator Persönliche Seite #1796007
Würde dazu auch das Linkerscript erweitern aber falls davor 
zurückgeschreckt wird, kann zuerst mit Linker-Option --section-start 
ausprobiert werden. So in der Art:
1
uint32_t config_foo[3]  __attribute__((section(".configsection"))) = { 
2
  0xdeadbeef, 0x0badf00d, 0xcafebabe 
3
};
1
arm-wieauchimmer-gcc [...] -Wl,--section-start=.configsection=0x20000 [...]

RIDE kenne ich nicht, irgendwo gibt es bestimmt eine Dialogbox mit 
Linker-Options o.ä.
Persönliche Seite #1799182
Arm Anfänger schrieb:
> Das Problem dabei ist, dass bei dem Mikrocontroller den ich verwende
> (STM32F103C6T6) immer nur 2K Blöcke im Flash-Speicher geändert werden
> können.

Wenn die absolute Adresse erstmal egal ist und lediglich das Alignment
interessiert, dann könntest Du das so schreiben:
1
const uint8_t Daten[2048] __attribute__ ((aligned (2048))) =
2
{
3
  0x01, 0x02, .....
4
};

(vorausgesetzt Dein Linker unterstützt das)

Gruß
Marcus
Gast #1801445
Die absolute Adresse ist leider nicht egal,
da der gesamte Flash speicher von der Start Adresse (0x08000000)
an in 2K Blöcke/Seiten unterteilt ist.

1. Block/Seite 0x08000000
2. Block/Seite 0x08000400
3. Block/Seite 0x08000800
...

Erstmal Ich habe nicht nur ein Array sondern 10. Jedes dieser Array 
müste dann bei ein vielfahes von 2K (0x400) beginnen.
Ich habe es jetzt so gelöst das Ich die Arrays erst
nach dem kompilieren via USB fülle.

Ist natürlich blöd das zwei Arbeitsschritte für die
komplette Programmierung eines MC notwendig sind.
Persönliche Seite #1801625
Arm Anfänger schrieb:
> Die absolute Adresse ist leider nicht egal,
> da der gesamte Flash speicher von der Start Adresse (0x08000000)
> an in 2K Blöcke/Seiten unterteilt ist.

So wie das Array definiert ist wird es im Flash angelegt. Die 
zusätzliche Einschränkung des Alignments wird dann dafür sorgen, dass 
das Array an einer beliebigen, ganzzahlig durch 2048 teilbaren Adresse 
im Flash liegt. Also beispielsweise so:

> 1. Block/Seite 0x08000000
> 2. Block/Seite 0x08000400
> 3. Block/Seite 0x08000800

> Erstmal Ich habe nicht nur ein Array sondern 10. Jedes dieser Array
> müste dann bei ein vielfahes von 2K (0x400) beginnen.

Dann legst Du das Alignment eben für alle fest. Müssen die 
hintereinander liegen? Dann definierst Du eben ein zweidimensionales 
Array, da die einzelnen Arrays sowieso eine Größe von 2K haben.

> Ist natürlich blöd das zwei Arbeitsschritte für die
> komplette Programmierung eines MC notwendig sind.

Und unnötig.

Gruß
Mmarcus
Gast #2264685
Matthias K. schrieb:
> Überlass den Linker die Zuweisung des Speicherbereiches für Dein Array
>
> und greif über einen Zeiger drauf zu.

Kannst du das bitte genauer erklären wie das mit einem Zeiger 
funktioniert?

Ich habe das Problem dass ich Daten schon mit dem Programmcode auf den 
Controller übertragen möchte. Diese Daten werden im Programm dann aber 
geändert und die geänderten Daten sollen auch nach dem Ein-und 
Ausschalten wieder vorhanden sein.
Wie lege ich in KEIL uVision4 für den STM32F107 Daten an, die im 
Programmspeicher stehen?

Gruß

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.