Ursprünglich wollte ich über die Serielle Schnittstelle einen ASCII
string empfangen, mit #include <sstream> in eine Zahl umwandeln und
diese Zahl an meine Variable "Auslesen" weitergeben, welche für den
Interrupt des Timers zuständig ist.
Naja, weit entfernt von einem Resultat.
Konnte jetzt für mich persönlich den Fehler soweit begrenzen, dass der
Variable "Auslesen" der Wert "15" wohl nicht übergeben wird, bzw die
Variable von der einen Interrupt-Routine in die andere nicht übertragen
wird?
Wo genau liegt mein Verständnisproblem?
Für eure Hilfe bedanke ich mich schon mal im Voraus.
mfg
c63
Problem Ungelöst schrieb:> int Auslesen;
Mach die mal 'volatile'. Generell sollte Variablen in ISR immer volatile
sein, weil der Kompiler sie sonst wegrationalisieren möchte. ISR werden
ja im Programm nicht aufgerufen und der Kompiler probiert eine
Optimierung. Apropos Optimierung, wie steht die bei dir?
Matthias Sch. schrieb:> Mach die mal 'volatile'. Generell sollte Variablen in ISR immer volatile> sein, weil der Kompiler sie sonst wegrationalisieren möchte. ISR werden> ja im Programm nicht aufgerufen und der Kompiler probiert eine> Optimierung. Apropos Optimierung, wie steht die bei dir?
nein ist hier nicht notwendig, weil er sie nur ein 2 ISR verwendet. Sie
wird nicht in Main verwendet!
Und die Aussage "Generell sollte Variablen in ISR immer volatile sein"
ist Unsinn.
Peter II schrieb:> weil er sie nur ein 2 ISR verwendet
Öhh, was willst du uns sagen? Die Variable steht auch nicht in der
ISR, sondern ist global deklariert.
Danke euch beiden für die Hilfe,
lag am fehlenden volatile :-)
@Matthias Sch.: Bin totaler newbie, was c programmieren betrifft,
deshalb bin ich mir nicht ganz sicher was du mit "Apropos Optimierung,
wie steht die bei dir?" meinst.
Hab mir mal im AVR Studio den Compiler Output durchgelesen, allerdings
nicht wirklich etwas in Richtung Optimierung seitens Compiler gefunden.
Matthias Sch. schrieb:> Öhh, was willst du uns sagen? Die Variable steht auch nicht in der> ISR, sondern ist global deklariert.
sie wird in zwei verschieden ISR verwendet, darum muss sich auch global
sein.
das volatile bringt hier überhaupt nichts, das ist nur notwendig wenn
eine Variable in einer ISR geändert wird und in der main( oder daraus
aufgerufenen Funktionen) abgefragt wird.
Ok lag doch nicht am volatile, sonder daran, dass der Timer zum
Zeitpunkt des Sendens via Schnittstelle schon über dem zugewiesenen
Variablenwert lag und somit der Interrupt erst nach weiteren 65536
Sekunden ausgelöst wird.
Peter II schrieb:> das volatile bringt hier überhaupt nichts, das ist nur notwendig wenn> eine Variable in einer ISR geändert wird und in der main( oder daraus> aufgerufenen Funktionen) abgefragt wird.
auch wenn die Variable in der einen ISR geändert wurde und dann in der
anderen verwendet wird (oder auch dort wieder geändert), ist volatile
genauso sinnvoll. Es muß nicht die main mit beteiligt sein. Einfach nur
zwei Programmstellen, die keine direkte sichtbare verbindung miteinander
haben, so daß der compiler sie nicht erkennen kann.
ISR schrieb:> auch wenn die Variable in der einen ISR geändert wurde und dann in der> anderen verwendet wird (oder auch dort wieder geändert), ist volatile> genauso sinnvoll. Es muß nicht die main mit beteiligt sein. Einfach nur> zwei Programmstellen, die keine direkte sichtbare verbindung miteinander> haben, so daß der compiler sie nicht erkennen kann.
nein. Du hast scheinbar das Problem nicht wirklich verstanden.
Am ende einer ISR muss der Compiler die Variable immer in den Ram
zurückschreiben und kann sie nicht im Register behalten. Damit kann
überhaupt kein Problem mit wegen Optimierung entstehen. Nur wenn Main
beteiligt ist, kann er sie im Register blassen, weil main nicht
verlassen wird.
Peter II schrieb:> das volatile bringt hier überhaupt nichts, das ist nur notwendig wenn> eine Variable in einer ISR geändert wird und in der main( oder daraus> aufgerufenen Funktionen) abgefragt wird.
Ist aber auch nicht ganz korrekt. Der "umgekehrte" Fall (in Main
geändert und in ISR nur gelesen) erfordert ebenso das volatile.