Hallo zusammen,
ich habe das Problem, daß ich eine Struktur initialisieren möchte.
Leider frisst das wieder einmal das RAM auf. Ich suche nach einer
geschickten Methode, sagen wir mal nach der geschicktesten ;-).
So in sieht mein Code vom Prinzip her aus:
1
typedefstruct{
2
uint8_tval1:4;
3
uint8_tval2:3;
4
uint8_t:1;
5
}_tStruct1;
6
7
typedefstruct{
8
uint8_tval3:3;
9
uint8_t:5;
10
11
uint8_tval4:4;
12
uint8_tval5:2;
13
uint8_t:2;
14
}_tStruct2;
15
16
typedefstruct{
17
_tStruct1tStruct1;
18
_tStruct2tStruct2;
19
}_tAlles;
20
21
_tAllestAlles={{0,0},{3,4,5}};
es muß doch eine Andere Lösug als memcpy_P geben, oder?
Hallo,
leider komme ich erst jetzt dazu, zu Antworten.
Die Struktur selber wird, da global, natürlich Speicher belegen müssen.
Mein Problem ist, daß die oben beschriebene Lösung 5 Bytes Ram
zusätzlich belegt, eben jene 5 Byte {0,0},{3,4,5}, die zur
Initialisierung vom Compiler in das RAM gelagert werden müssen.
Ich suche vom Prinzip nach einer geschickten Möglichkeit, dem Compiler
klarzumachen, daß er die Initialwerte aus dem Progmem nehmen soll.
Nach meinem Verständnis (bitte korrigiert mich) landet die globale
Variable in der .data section, die Initialwerte aus diesem Beispiel in
der .bss section. Beide futtern RAM - daher meine Frage.
Freue mich auf Antwort und Gruß,
Christian
Nein, .bss ist Speicher, der zur Laufzeit mit 0 initialisiert wird.
Deine Initialisierung benötigt also ausschließlich den ROM für
den intializer (das geht nicht anders) sowie den RAM, da es sich ja
um eine Variable handelt, die man zur Laufzeit ändern kann.
Hallo Jörg,
vielen Dank für Deine schnelle Antwort.
Habe ich das denn nun richtig verstanden, daß
ROM = .data + .text ist und
RAM = .data + .bss ?
Also frisst der initializer extra 5 Byte RAM (dieses Beispiel), die
nicht mehr zur Verfügung stehen.
Die beste Lösung besteht dann also aus einem Array im PROGMEM, dass zu
Beginn in das RAM zur Initialisierung der Struktur kopiert wird....?
Gruß,
Christian
ChristianS wrote:
> Habe ich das denn nun richtig verstanden, daß> ROM = .data + .text ist und> RAM = .data + .bss ?
Ja, wobei "RAM" hier "statischer RAM-Verbrauch" heißt -- es kommt
noch der dynamische Verbrauch auf dem Stack dazu, auf dem auch
(funktions-)lokale Daten landen.
> Also frisst der initializer extra 5 Byte RAM (dieses Beispiel), die> nicht mehr zur Verfügung stehen.
Nein! Er braucht keine 5 Byte RAM extra, sondern es werden die 5
Byte RAM benötigt, die die Variable ohnehin braucht, sowie 5 Byte
ROM für die Initialwerte. Das ist der Grund, warum .data zweimal
auftaucht. Da der ROM aber die einzige Möglichkeit ist, Initialwerte
irgendwie unterzubringen, wüsste ich nicht, wie du diese 5 Byte noch
irgendwie einsparen können willst.