Forum: Compiler & IDEs Linkerskripte und initialisierte Variablen in Flash und RAM


von Matthias H. (retrode)


Lesenswert?

Hallo zusammen,

ich bin gerade dabei, mich mit Linkerskripten anzufreunden, aber habe 
noch ein Verständnisproblem, was initialisierte Variablen anbelangt. Ich 
habe mehrere Files, deren Variablen auf bestimmte Weise abgelegt werden 
sollen. Im RAM sollen die Variablen dicht gepackt sein, aber ihre 
Initialwerte im PROGMEM in getrennten Sektionen liegen. Nehmt mal 
folgendes Minimalbeispiel:

file1.c:
1
uint8_t file1_field __attribute__ ((section (".file1data"))) = "111111111111";
2
void file1_proc(void) __attribute__ ((section (".file1text")));
3
void file1_proc(void) { etc. }

file2.c:
1
uint8_t file2_field __attribute__ ((section (".file2data"))) = "222222222222";
2
void file2_proc(void) __attribute__ ((section (".file2text")));
3
void file2_proc(void) { etc. }

linkerscript.x:
1
FlashPageSize = 64;
2
SECTIONS {
3
.text : 
4
  {
5
  /* vectors, trampolines, jumptables */
6
  /* .init* / .fini* sections */
7
  /* etc */
8
  *(.file1text)
9
  . = ALIGN(FlashPageSize);
10
  *(.file2text)
11
} > text
12
13
.data : AT (ADDR (.text) + SIZEOF (.text))
14
  {
15
  PROVIDE (__data_start = .) ;
16
  *(.file1data)
17
  *(.file2data)
18
  . = ALIGN(2);
19
  _edata = . ;
20
  PROVIDE (__data_end = .) ;
21
} > data
22
}

Nun ist das Dilemma, dass die Ablage der Initialwerte im PROGMEM 
offenbar immer der Anordnung im RAM folgt, und diese auch von 
_copy_data.o in einem Abwasch kopiert werden. Was aber, wenn ich nicht 
nur den Programmcode, sondern auch die Variablen im Flash komplett 
getrennt ablegen möchte? Wie müssten die Dateien oben aussehen, damit 
die Initialwerte zu .file1data im Flash auf .filetext folgen, und die zu 
.file2data auf .file2text, und beide getrennt initialisiert werden?

Mein Workaround besteht momentan darin, die Variablen einmal im RAM als 
.noinit und einmal im Flash als PROGMEM abzulegen, und die 
Initialisierung von Hand zu machen. Geht das auch eleganter?

Schönen Gruß,
Matthias

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.