Forum: Compiler & IDEs Struktur initialisieren


von ChristianS (Gast)


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?

von Rolf Magnus (Gast)


Lesenswert?

Mir ist das Problem nicht ganz klar. Warum frißt diese Initialisierung 
RAM, und was hat das mit memcpy_P (Das vom AVR?) zu tun?

von ChristianS (Gast)


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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von ChristianS (Gast)


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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

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.