Forum: Mikrocontroller und Digitale Elektronik Wo liegen Daten von Strukturen


von Sam (Gast)


Lesenswert?

Hallo,
ich habe folgende Deklaration eines Strukturtyps:

typedef struct structtype{
    f32 var1;
    s16 var2;
    const s16* var3;
    const s16* var4;
}

// Davon werden zwei Instanzen angelegt:

structtype struct1;
structtype struct2;



Liegen die Daten der Struktur nun komplett im RAM oder die ersten beiden 
Elemente im RAM und die letzten beiden Elemente im ROM?

Gruß
Samuel

von Peter II (Gast)


Lesenswert?

Sam schrieb:
> Liegen die Daten der Struktur nun komplett im RAM oder die ersten beiden
> Elemente im RAM und die letzten beiden Elemente im ROM?

merkwürdige frage.

du hast keine Daten in den beiden Instanzen, damit werden sie mit 0 
initialisiert. Danach stehen sie im Ram. Ob die 0 aus dem Rom kommt, 
wird wohl abhängig vom Compiler sein.

von Senior-Programmierer (Gast)


Lesenswert?

Sam schrieb:
> Liegen die Daten der Struktur nun komplett im RAM oder die ersten beiden
> Elemente im RAM und die letzten beiden Elemente im ROM?

Sie liegen komplett im RAM. Ein const sorgt nicht dafür, dass die 
Daten in das ROM wandern.

von Sam (Gast)


Lesenswert?

Sorry kich habe vergessen zu schreiben, dass ich beide Instanzen 
natürlich fülle.

s16 param1;
s16 param2;
s16 param3;
s16 param4;

structtype struct1= {
        .var1 = 1.0,
        .var2 = 5,
        .var3 = &param1,
        .var4 = &param2,
};

structtype struct2= {
        .var1 = 2.5,
        .var2 = 11,
        .var3 = &param3,
        .var4 = &param4,
};

Elemente 3 und 4 enthalten also konstante Adressen von Variablen. Was 
kann ich tun, damit diese im ROM liegen um Speicherplatz im RAM zu 
sparen?? das Schlüssenwort const reicht ja anschienden nicht aus.

von Peter II (Gast)


Lesenswert?

Sam schrieb:
> Elemente 3 und 4 enthalten also konstante Adressen von Variablen. Was
> kann ich tun, damit diese im ROM liegen um Speicherplatz im RAM zu
> sparen?? das Schlüssenwort const reicht ja anschienden nicht aus.

C kennt erst mal kein ROM. Es kommt also auf dein Compiler und deine 
Hardware an.

von Hanswurst (Gast)


Lesenswert?

Ich kann Dir leider keine klare Antwort darauf geben, aber doch 
folgendes sagen.

Was genau mit const Variablen geschieht und was die Frage "Flash oder 
nicht Flash" betrifft, sollte das Compilermanual Auskunft geben können. 
Welcher Compiler ist es denn? GCC, legt wenn ich mich nicht irre, auch 
const Variablen nicht ohne weiteres im Flash ab. Dazu gibt es spezielle 
(nicht Standard) Schlüsselworte resp. Attribute. Hingegen meine ich von 
Keil schonmal gelesen zu haben, dass er das macht.

Es gibt noch die Methode, mittels Linkerscript ganze Variablen im Flash 
ablegen zu lassen. Auch dazu gibt es hier und sonst im Internet einige 
Seiten.

Wenn es allerdings um ein "gemischtes" ablegen von einzelnen 
Strukturmitgliedern geht, wäre das eine zusätzliche Komplikation für den 
Compiler, die vermutlich noch nie jemand auf sich genommen hat. Will 
sagen: Vermutlich gibt es das nicht. Habe ich noch nie von gehört. Was 
nichts heissen muss.

Nimmt man meine Vermutung als gegeben, so wäre es allenfalls möglich 
eine Struktur komplett im Flash abzulegen. Dein Beispiel allerdings 
kommt mir, vermutlich siehst Du das selbst auch so, ein wenig "an den 
Haaren herbeigezogen" vor. Falls Du das aber tatsächlich wörtlich meinst 
und nicht nur für die Frage so hingestellt hast, sollte man mal darüber 
reden.

Jedenfalls ist die häufigste Lösung die, selbst im Kopf zu behalten, 
dass es sich bei einem Mitglied um einen Zeiger ins Flash handelt und 
die entsprechenden Schreib- und Lesefunktionen dafür zu schreiben.

Leider keine "Lösung" (tm) aber, wie ich hoffe, ein wenig Futter.

von Mark B. (markbrandis)


Lesenswert?

Sam schrieb:
> Was kann ich tun, damit diese im ROM liegen

Ziemlich wenig. Dazu müsstest Du den ROM (Nur-Lese-Speicher) 
modifizieren, was bekanntlich nur ein einziges Mal zu Beginn seiner 
Lebensdauer möglich ist.

SCNR ;-)

von B. S. (bestucki)


Lesenswert?

Sam schrieb:
> const s16* var4;

Der Zeiger ist nicht const.
1
int * A; /* Zeiger auf int */
2
const int * B; /* Zeiger auf const int */
3
int * const C; /* const-Zeiger auf int */
4
const int * const D; /* const-Zeiger auf const int */


Eine Struktur kann nur im Flash abgelegt werden, wenn alle Member 
ebenfalls im Flash abgelegt werden können, also die gesamte Struktur 
const ist (nicht die einzelnen Member, sondern die Struktur) und alle 
Werte zur Compile-Zeit ermittelt werden können.

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.