STM32F4 - internes SRAM

Gast #4254881
Lesenswert?
• ▲
▼
Hallo,

ich möchte
1
#define MAXDATENSPIEGEL (1024)
2
static __attribute__((section ("Datenspiegel"))) volatile uint8_t Datenspiegel[MAXDATENSPIEGEL];

an einen festen bereich im internen SRAM legen.
Hierfür habe ich das Scatter File umgeschrieben
1
LR_IROM1 0x08000000 0x00200000  {    ; load region size_region
2
  ER_IROM1 0x08000000 0x00200000  {  ; load address = execution address
3
   *.o (RESET, +First)
4
   *(InRoot$$Sections)
5
   .ANY (+RO)
6
  }
7

8
   RW_IRAM1 0x20000000 0x0002FC00{
9
   
10
   .ANY (+RW +ZI)
11
   
12
   }
13
 
14
   RW_IRAM_PROT 0x2002FC00 0x400
15
   {
16
   *(Datenspiegel)
17
   }
18
}


Das 1024 Byte große Array sollte eigentlich genau reinpassen.
Hex 400 sind 1024 Byte.

Allerdings bekomme ich eine folgende Fehlermeldung:
Error: L6220E: Execution region RW_IRAM_PROT size (2048 bytes) exceeds 
limit (1024 bytes). Region contains 0 bytes of padding and 0 bytes of 
veneers (total 0 bytes of linker generated content).

Warum muss mein Speicherbereich 2048 Byte groß sein, wenn ich doch nur 
1024 Byte speichern möchte bzw. wenn mein Array nur 1024 Byte groß ist ?
Ist ja als uint8_t angegeben.
Gast #4254885
Lesenswert?
• ▲
▼
Nachtrag:
1
#define MAXDATENSPIEGEL (1024)
2
static __attribute__((section ("Datenspiegel"))) volatile uint8_t Datenspiegel[MAXDATENSPIEGEL];

war in einer Headerdatei definiert.
Wenn ich
1
static __attribute__((section ("Datenspiegel"))) volatile uint8_t

in die zugehörige .c Datei schreibe funktioniert es.
Wisst ihr, warum das so ist ?
Persönliche Seite #4254896
Lesenswert?
• ▲
▼
SCF schrieb:
> war in einer Headerdatei definiert.

Und wie oft hast Du die Headerdatei irgendwo eingebunden?

Ich tippe auf ... genau zwei Mal.

Damit hast Du in jedem C-Modul, in dem Du die Headerdatei eingebunden 
hast, eine neue Instanz Deines Arrays angelegt -- und da Du das als 
static deklariert hast, motzt auch nicht der Linker, denn das ist 
legal.

Merke:
Variablendefinitionen gehören nie in Headerdateien.
Gast #4254911
Lesenswert?
• ▲
▼
Also....

Du verwendest offensichtlich Keil MDK. Sagt zumindest meine Glaskugel.

Architektur ist vermutlich eine STM32xxx. Sagt ebenfalls meine 
Glaskugel.

Schei...., jetzt ist die Batterie alle im Glaskugel....

So ein Mist aber auch...

PS: kleiner Hinweis: schau dir doch mal gaaaanz genau an, was du da oben 
fabriziert hast...
Gast #4254916
Lesenswert?
• ▲
▼
Rufus Τ. F. schrieb:
> SCF schrieb:
>> war in einer Headerdatei definiert.
>
> Und wie oft hast Du die Headerdatei irgendwo eingebunden?
>
> Ich tippe auf ... genau zwei Mal.
>
> Damit hast Du in jedem C-Modul, in dem Du die Headerdatei eingebunden
> hast, eine neue Instanz Deines Arrays angelegt -- und da Du das als
> static deklariert hast, motzt auch nicht der Linker, denn das ist
> legal.
>
> Merke:
> Variablendefinitionen gehören nie in Headerdateien.

Vielen Dank für die Erklärung.
Funktioniert alles.

Antwort schreiben

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.

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.