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