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