Variablen im RAM?

Gast #1067608
Lesenswert?

Hallo,

ich habe eine Frage bez. zu den Variablen. Wenn ich eine Variable im 
Programm deklariere (z.B. int a = 0;), wird diese Variable im RAM 
abgelegt?

Und wenn ich im Programm bestimmte Variablen im RAM Speicher genau 
positionieren möchte, welche Adresse sollte ich wählen? Könnte ich 
dadruch nicht eine Variable, die automatisch im RAM abgelegt ist, damit 
überschreiben???

Danke!

Grüße,
FrageMan
Moderator Persönliche Seite #1067614
Lesenswert?

FrageMan wrote:

> ich habe eine Frage bez. zu den Variablen. Wenn ich eine Variable im
> Programm deklariere (z.B. int a = 0;), wird diese Variable im RAM
> abgelegt?

Unter Umständen: ja.  Unter andere Umständen lebt sie nur in einem
Register, und wieder andere Variablen brauchst du zwar zum Verständnis
deines C-Codes, der Compiler braucht sie aber rein gar nicht.  Dann
wird es sie auch im fertigen Code nicht mehr geben.

(Das alles setzt natürlich eingeschaltete Optimierungen voraus.)

> Und wenn ich im Programm bestimmte Variablen im RAM Speicher genau
> positionieren möchte, [...]

...dann hast du einen Denkfehler.  Beschreibe lieber dein Problem
stattdessen, und es wird sich eine bessere Lösung dafür finden, davon
bin ich überzeugt.
Gast #1067637
Lesenswert?

Das Problem ist, dass mein Programm zusammen mit einem anderen Programm 
kombiniert werden soll. Beide Programme werden unabhängig von einander 
und von verschiedenen Leuten programmiert. Wenn beide Programmteile 
zusammengefügt werden, entsteht ein einziges Programm, wo der einer Teil 
auf die Funktionen des anderen Teils zugreift und Variablen übergibt. 
Die Übergabe der Variablen geschieht über die Adresse der Variable.
Es gibt eine Funktion, der eine Offset-Adresse übergeben wird und dann 
liest die Funktionen 8 Variablen die im Speicher nacheinander abgelegt 
sind (Adressen: Offset + 1, Offset + 2, ..., Offset + 8)

Wie kann man das realisieren? Wie groß muss die Offsetadresse sein?
Moderator Persönliche Seite #1067656
Lesenswert?

FrageMan wrote:

> Wie kann man das realisieren?

Dafür gibt es verschiebliche Objektcodemodule, die der Linker dann
zusammen fügt.

Alles andere ist ein Ratespiel.  Kann sein, dass es funktioniert,
aber es gibt auch niemanden, der laut aufschreit, wenn du die
Zuweisungsbereiche überschreitest.

Wenn's partout auf diese Weise statt als Objektcode sein muss, dann
wohl am ehesten mit einem zugeschnittenen Linkerscript, bei dem der
Kommunikationsbereich in einer separaten section landet.  Dann kann
zumindest der Linker noch den section overlap feststellen.
Gast #1067684
Lesenswert?

Seid ihr sicher, dass ihr das so kompliziert lösen müsst? Man kann durch 
aus mit verschiedenen Leuten verschiedene Komponenten eines einzigen 
Programms entwicheln. Teilt auf, wer welche Funktionen schreibt und 
kopiert dann eure Dateien in einen Ordner, kompiliert das ganze und 
schon habt ihr ein fertiges Program.
Gast #1069148
Lesenswert?

Hallo,

da der OP ja nicht schreibt, auf welchem System und mit welchen weiteren 
Randbedingungen das implementiert werden soll, werfe ich mal das 
Stichwort 'Interprozesskommunikation' in die Diskussion. Da wäre dann 
Shared Memory eine Realisierung von gemeinsamen Variablen an bekannten 
(relative zum Segmentanfang) Adressen. Immerhin ist ja von zwei 
Programmen (im engeren Sinne ?) die Rede...

Oder man implementiert es in Form von Threads, sofern die 
System-Umgebung das unterstützt.

Für den AVR schließe ich mich den Ratschlägen hier an, nicht zu 
kompliziert machen.

Gruß
Hermann-Josef
#1072879
Lesenswert?

Also ich würde da an IO Register denken, die ja ne feste Adresse haben 
und einzeln angesprochen werden können, zum beispiel GPIOR0, 1 oder wie 
sie heißen. Dort passen schon z.b. 16 bit, so das sich ein Pointer 
übergeben ließe. So sollten auch beliebig große Structs gemeinsam 
benutzbar sein, oder? Kenn mich mit c noch nicht so aus, mach ich einen 
Denkfehler?

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