www.mikrocontroller.net

Forum: Compiler & IDEs Struktur initialisieren


Autor: ChristianS (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
typedef struct{
    uint8_t val1 : 4;
    uint8_t val2 : 3;
    uint8_t      : 1;
}_tStruct1;

typedef struct{                                                 
    uint8_t val3 : 3;
    uint8_t      : 5;

    uint8_t val4 : 4;
    uint8_t val5 : 2;
    uint8_t      : 2;
}_tStruct2;

typedef struct{                                                                 
    _tStruct1 tStruct1;
    _tStruct2 tStruct2;
}_tAlles;

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

es muß doch eine Andere Lösug als memcpy_P geben, oder?

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: ChristianS (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: ChristianS (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.