Forum: Compiler & IDEs Zugriff auf globale Variablen


von Rahul (Gast)


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

von Joerg Wunsch (Gast)


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. ;-)

von Rahul (Gast)


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

von Rahul (Gast)


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

von Joerg Wunsch (Gast)


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.

von Rahul (Gast)


Lesenswert?

Danke Jörg!

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.