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
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.
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?
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.
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
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.