Struktur initialisieren

Gast #626143
Lesenswert?

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
typedef struct{
2
    uint8_t val1 : 4;
3
    uint8_t val2 : 3;
4
    uint8_t      : 1;
5
}_tStruct1;
6

7
typedef struct{                                                 
8
    uint8_t val3 : 3;
9
    uint8_t      : 5;
10

11
    uint8_t val4 : 4;
12
    uint8_t val5 : 2;
13
    uint8_t      : 2;
14
}_tStruct2;
15

16
typedef struct{                                                                 
17
    _tStruct1 tStruct1;
18
    _tStruct2 tStruct2;
19
}_tAlles;
20

21
_tAlles      tAlles = {{0,0},{3,4,5}};

es muß doch eine Andere Lösug als memcpy_P geben, oder?
Gast #630847
Lesenswert?

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
Gast #630882
Lesenswert?

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
Moderator Persönliche Seite #630958
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren