mikrocontroller.net

Forum: Compiler & IDEs Variablen im RAM?


Autor: FrageMan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: FrageMan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hermann-Josef (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Moritz E. (devmo)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.