www.mikrocontroller.net

Forum: Compiler & IDEs STM32 Array mit definierter Adresse


Autor: Arm Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
const uint8_t Daten[2048] =
{
  0x01, 0x02, .....
};

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

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?

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Arm Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Matthias K. (matthiask)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: narf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
über welche schnittstelle ?

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

Autor: Arm Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: narf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wenn über USB .. so ost das problem die adresse zu übergeben

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

Autor: Arm Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias K. (matthiask)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Martin Thomas (mthomas) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
uint32_t config_foo[3]  __attribute__((section(".configsection"))) = { 
  0xdeadbeef, 0x0badf00d, 0xcafebabe 
};
arm-wieauchimmer-gcc [...] -Wl,--section-start=.configsection=0x20000 [...]

RIDE kenne ich nicht, irgendwo gibt es bestimmt eine Dialogbox mit 
Linker-Options o.ä.

Autor: Marcus Harnisch (mharnisch) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
const uint8_t Daten[2048] __attribute__ ((aligned (2048))) =
{
  0x01, 0x02, .....
};

(vorausgesetzt Dein Linker unterstützt das)

Gruß
Marcus

Autor: Arm Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Marcus Harnisch (mharnisch) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Neueinsteiger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

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.