Hi, ich bastle gerade an der AVR134 AppNote rum (Software RTC). Mir ist
da gerade aufgefallen, dass die Struct für DateTime nicht volatile ist,
aber sowohl innerhalb als auch außerhalb verwendet wird.
1
typedefstruct{
2
unsignedcharsecond;//enter the current time, date, month, and year
3
unsignedcharminute;
4
unsignedcharhour;
5
unsignedchardate;
6
unsignedcharmonth;
7
unsignedintyear;
8
}time;
9
10
timet;
Trotzdem funktioniert der Code. Ist das jetzt eher Zufall oder ist das
so beabsichtigt?
Hi Markus,
Aber ohne weiteren Programmcode kann dir keiner Helfen !
Ich gehe mal von der angehängten Datei aus oder ?
t wird nicht in der Main gelesen, also ist das auch kein Problem mit der
ISR.
Markus schrieb:> Ist das jetzt eher Zufall oder ist das so beabsichtigt?
Wenn es nur diese beiden Varianten gäbe, dann eher Zufall. Dass eine
Struktur in Registern gehalten wird, ist eher unwahrscheinlich. Also
muss die irgendwo im Speicher stehen, wo sie auch bleibt. Zur
einheitlichen und übersichtlichen Deklaration würde ich allerdings das
'volatile' dazu machen.
wenn du die Struktor volatile machst, dann wird der zugriff auf die
Variabeln in der ISR langsamer. Wenn das ganze zeitkritisch ist könnten
damit neue Probleme entstehen.
Peter II schrieb:> wenn du die Struktor volatile machst, dann wird der zugriff auf die> Variabeln in der ISR langsamer.
Aber nur wenn man in der ISR mehrfach auf die selbe Variable zugreift.
In diesem Fall bietet es sich an, sie anfangs in eine lokale Variable zu
kopieren und/oder (je nach Fall) am Ende wieder zurück. Dann die
eigentlichen Zugriffe auf die lokale Variable machen.
Peter II schrieb:> dann wird der zugriff auf die Variabeln in der ISR langsamer
In der ISR kann ich mir das nicht vorstellen. Höchstens in der main(),
denn die Werte müssen ja immer aktuell sein, falls ein Interrupt
zuschlägt.
Aber: Wenn die Struktur in der main() und in ISRs verwendet wird, dann
muss ein ordentlicher Zugriff immer gewährleistet sein. Da darf sich der
Code in diesem Fall nicht unterscheiden. Ob nun mit oder ohne
'volatile'. Sonst würde es ja nicht funktionieren.
Markus schrieb:> also so wäre es richtig?> volatile time t;
Richtig? Falsch? ... Ich würde es so machen.
Rolf Magnus schrieb:> Aber nur wenn man in der ISR mehrfach auf die selbe Variable zugreift.
Hm, hab' ich nicht beachtet.
Rechnet der Compiler damit, dass die ISR unterbrochen werden kann?
Auch innerhalb der ISR muss der Compiler die Struktur als volatile
behandeln und jeden Zugriff so ausführen wie hingeschrieben. Der weiss
nämlich nicht, ob die ISR selbst wiederum unterbrechbar ist oder ob die
betreffenden Daten irgendwie von der Hardware verändert werden (DMA,
I/O-Register, ...).
Ralf schrieb:> In der ISR kann ich mir das nicht vorstellen.
ist aber so.
jeder Zugriff auf die Variabel finden im Ram statt im Register statt.
Das heist für jeden Zugriff wird die Variable in ein Register gelesen,
dann das Register geändert und dann sofort das Register zurück in den
Ram kopiert.
Nach neuem Erkenntnisstand :-)
So:
Ralf schrieb:> Markus schrieb:>> also so wäre es richtig?>> volatile time t;> Richtig? Falsch? ... Ich würde es so machen.
Und das beachten:
Rolf Magnus schrieb:> Aber nur wenn man in der ISR mehrfach auf die selbe Variable zugreift.> In diesem Fall bietet es sich an, sie anfangs in eine lokale Variable zu> kopieren und/oder (je nach Fall) am Ende wieder zurück. Dann die> eigentlichen Zugriffe auf die lokale Variable machen.
Ralf schrieb:> Rolf Magnus schrieb:>> Aber nur wenn man in der ISR mehrfach auf die selbe Variable zugreift.> Hm, hab' ich nicht beachtet.> Rechnet der Compiler damit, dass die ISR unterbrochen werden kann?
Der Compiler weiß nichts von ISRs. Für ihn sind das ganz normale
Funktionen. Auch volatile steht erstmal in keinem direkten Zusammenhang
mit ISRs. Also behandelt der Compiler die Variable in der ISR ganz genau
so, wie er sie auch außerhalb behandeln würde.
Rolf Magnus schrieb:> Also behandelt der Compiler die Variable in der ISR ganz genau> so, wie er sie auch außerhalb behandeln würde.
Hm, eine andere (normale) Variable hat er aber anscheinend wegoptimiert.
Zumindest hat es erst funktioniert, nachdem ich sie volatile gemacht
habe
Markus schrieb:> Rolf Magnus schrieb:>> Also behandelt der Compiler die Variable in der ISR ganz genau>> so, wie er sie auch außerhalb behandeln würde.>> Hm, eine andere (normale) Variable hat er aber anscheinend wegoptimiert.
Ja, also eben so, wie er es in einer normalen Funktion auch getan hätte.