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
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.
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.
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 = ¶m1,
.var4 = ¶m2,
};
structtype struct2= {
.var1 = 2.5,
.var2 = 11,
.var3 = ¶m3,
.var4 = ¶m4,
};
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.
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.
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.
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 ;-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.