Forum: Compiler & IDEs STM32 Array mit definierter Adresse


von Arm Anfänger (Gast)


Lesenswert?

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?

von (prx) A. K. (prx)


Lesenswert?

Prinzip bei GCC: Array mit __attribute__((section("SCHROTT"))) in eigene 
Section legen und im Linker-Script diese Section in den gewünschten 
Adressbereich legen.

von Arm Anfänger (Gast)


Lesenswert?

Ich habe keine Erfahrungen mit den Linker Skripten.
Wie macht man das, wenn das Array z.B. bei der Adresse 0x08010000
gespeichert werden soll?

von Matthias K. (matthiask)


Lesenswert?

Feste Adress-Zuodnung sollte man in C möglichst vermeiden.

Überlass den Linker die Zuweisung des Speicherbereiches für Dein Array 
und greif über einen Zeiger drauf zu.

von narf (Gast)


Lesenswert?

über welche schnittstelle ?

aber ansonst wie der vorredner . einen zeiger drauf und alles is schick

von Arm Anfänger (Gast)


Lesenswert?

@ 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

von narf (Gast)


Lesenswert?

wenn über USB .. so ost das problem die adresse zu übergeben

bzw schreib dir passend ein paar funktionen die dir die addressierung 
übernehmen

von Arm Anfänger (Gast)


Lesenswert?

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.

von Matthias K. (matthiask)


Lesenswert?

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.

von Martin T. (mthomas) (Moderator) Benutzerseite


Lesenswert?

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.ä.

von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

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

von Arm Anfänger (Gast)


Lesenswert?

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.

von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

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

von Neueinsteiger (Gast)


Lesenswert?

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ß

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