Wo liegen Daten von Strukturen

Gast #4653709
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
Gast #4653714
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.
Gast #4653752
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.
Gast #4653755
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.
Gast #4653772
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.
#4654642
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.

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