www.mikrocontroller.net

Forum: Compiler & IDEs Zugriff auf globale Variablen


Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin!
Ich habe das Problem, dass ich verschiedene Funktionen habe, die auf
eine globale Variable lesend und schreibend zugreifen müssen.
Mit Hilfe dieser Variable (CTS) soll/wird die Kommunikation über eine
Halbduplex-Schnittstelle (RS485) gesteuert (werden):
Es wird ein Datensatz (4 Byte) gesendet und der Empfänger quittiert
diesen dann irgendwann.
Es darf aber erst wieder gesendet werden, wenn eine Antwort eingegangen
ist (CTS=1).
Solange keine Antwort eingegangen ist, soll CTS=0 sein.
Die Empfangsprozedur läuft interrupt-gesteuert und setzt CTS=1, sobald
4 Byte eingegangen sind.

Es kann also passieren, dass die Sendeprozedur in einer Warteschleife
hängen bleibt, solange CTS=0 ist.
Diese Schleife besteht auch nur aus "while(CTS==0);".
Wenn jetzt die Empfangsprozedur CTS=1 setzt, passiert leider immer noch
nichts neues. Kann es sein, dass das eine CTS in einer anderen
Speicherstelle steht als das andere? (Meine Vermutung)
Wie bringe ich den Compiler dazu, dass das funktioniert? Oder welchen
Fehler mache ich da?

Vielen Dank im Vorraus
Rahul

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
FAQ lesen.

FAQ#1: Variablen, die außerhalb des Sichtbereiches des Compilers (also
z. B. sowohl innerhalb einer ISR als auch im Hauptprogramm) geändert
werden können, müssen `volatile' deklariert werden, damit der
Compiler
keine Zugriffsoptimierungen darauf macht.

Ach so: FAQ lesen. ;-)

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn meine Vermutung richtig ist, fragt der µC gar nicht mehr die
Speicherstelle ab:

 1a0:  80 91 01 01   lds  r24, 0x0101
 1a4:  81 30         cpi  r24, 0x01  ; 1
 1a6:  f1 f7         brne  .-4        ; 0x1a4

So wie ich diese Fragment verstehe, wird der Inhalt der Speicherstelle
0x0101 in das Register r24 geladen, dessen Inhalt mit 0x01 verglichen
und dann entschieden, ob die Schleife verlassen wird, oder der
Vergleich noch mal durchgeführt wird.
Das erscheint mir wenig sinnvoll, weil nicht r24 verändert wird, sonder
die Speicherstelle 0x0101. Sehe ich das richtig?
Wie kann man das jetzt C-technisch beheben?

Schönen Gruß
Rahul

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Hilfe!
Es funktioniert.

Aber wo finde ich die FAQ?
Unter savannah.org  gibt es nur ein Statement, dass die Seite umgezogen
ist, und in der veralteten ist irgendwie auch nichts zu finden.
Gibt es irgendwo eine Beschreibung zu solchen Funktionen?
In einem anderen Tread habe ich auch solche Sachen wie
"__attribute__" gefunden.
Was bewirkt sowas? Wo kann ich etwas darüber finden?
Schönen Gruß
Rahul

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Aber wo finde ich die FAQ?

Sehr wahrscheinlich auf Deiner Festplatte, zumindest falls Du ein
WinAVR installiert hast.

> Unter savannah.org gibt es nur ein Statement, dass die Seite
> umgezogen ist, und in der veralteten ist irgendwie auch nichts zu
> finden.

,,umgezogen'' ist gut. ;-)

Es steht dort, daß es einen Einbruch bei denen gab
(savannah.nongnu.org übrigens) und daß deren Inhalte noch nicht wieder
online sind.

> _attribute_ ... Wo kann ich etwas darüber finden?

In der GCC-Doku, ebenfalls auf Deiner Festplatte.

In der avr-libc Doku (Du weißt schon: wiederum auf Deiner Platte ;),
die FAQ ist Bestandteil davon) teilweise, die für AVR wesentlichen
Sachen haben wir dort auch mit erwähnt.

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Jörg!

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.