Forum: Compiler & IDEs Variablen im RAM?


von FrageMan (Gast)


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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von FrageMan (Gast)


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?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von Peter (Gast)


Lesenswert?

warum keine gemeinsame header datei, wo die variablen und funktionen als 
extern drin stehen und auf einer von beiden seiten wird sie dann 
implementiert der linker baut es dann zusammen

von Klaus (Gast)


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.

von Hermann-Josef (Gast)


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

von Moritz E. (devmo)


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?

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.